Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
nataca

Một số hàm con VL- hữu ích

Các bài được khuyến nghị

Một số hàm con VL- hữu ích . Share cùng mọi người

 

VxAlignAtts

Rotates all attributes of a block to n°

 

VxGetAtts

Reads all attribute values from a block

 

VxSetAtts

Sets attribute values to block

 

VxGetOpenDwgs

Returns a list of all open drawings including path

 

VxGetTextStyles

Returns a list of all text style names and her font files

 

VxGetLineTypes

Returns a list of all line types and her descriptions

 

VxGetDimStyles

Returns a list of all dimension style names

 

VxGetXplotLayers

Returns a list of all plot or non plot Layers

 

VxGetLockLayers

Returns a list of all locked Layers

 

VxIsOnLockedLay

Check an object for locked Layer

 

VxGetLayoutNames

Returns a list of all Layout names

 

VxGetVptBoundary

Returns the lower left and upper right corner of a v'port in modelspace coordinates

 

VxGetLoadedMenus

Returns a list of all loaded Menu files and Groups

 

VxUnLoadMenuGroup

Unloads the specified Menu Group

 

VxGetPopups

Returns a list with all Menu groups, PopupID's and their IsVisible property

 

VxGetToolbars

Returns a list with all Menu groups, ToolbarID's and their IsContext property

 

VxXetDispCmdLines

Sets or gets the number of command lines

 

VxXetDispHistLines

Sets or gets the number of history lines in the text window

 

VxGetLoadedVbaProjs

Returns a list of all loaded VBA-Project names

 

VxGetDispBackCol

Returns the ACI-ColorNº of the actual graphics background color

 

VxOleToAciCol

Converts a OLE- to a ACI-Color number

 

VxGetTrueCol

Returns a TrueColor list from an object

 

VxSetTrueCol

Applies a TrueColor list to an object

 

VxDeleteGroup

Deletes a Group by name

 

VxGetGroupNames

Returns a list of all Group name(s) of the object

 

VxGetAcadLicenseInfos

Returns the license information's of the current AutoCAD version

 

VxGetAcadLanguage

Returns the *program* language of the current AutoCAD version

 

VxScrollDocs

Scrolls the open docs in alphabetic order up or down

 

VxGetMassProps

Returns a list of all mass properties of the object

 

VxGetInters

Returns all intersection points between two objects

 

VxGetBlockInters

Returns all intersection points between a block and an object

 

VxCloneBlockRef

Clones the specified block reference to a new name

 

VxExplode

Explodes complex objects

 

VxGetTangentAtPoint

Returns the tangent at the specified point

 

VxGetEndPoints

Returns the endpoints of an object

 

VxRevPline

Reverse vertex order of Polylines

 

VxGetObjLength

Returns the length of all kinds of objects

 

VxSetDrawOrder

Changes draw order of object(s) by given method

 

VxSsetSelect

ActiveX counterpart to 'ssget'

 

VxSsetMake

Creates a new selection set or clears an existing one

 

VxSsetFilter

Creates a filter for SelectXxx methods

 

VxListToArray

Converts a list into an array

 

VxArrayToList

Converts an array into a list

 

VxStringSubst

Substitutes one string for another, within a string

 

VxGetDriveInfos

Returns information's from a drive

 

VxGetFileInfos

Returns information's from a file

 

VxCopyFiles

Copies the specified file(s)

 

VxDeleteFiles

Deletes the specified file(s)

 

VxMakeDirectory

Creates the specified directory(ies)

 

VxDelDirectory

Deletes the specified directory

 

VxListNetworkDrives

Returns a list of all mapped network drives with UNC paths

 

VxRemapNetworkDrive

Remaps a network drive to another drive letter

 

VxCreateShortCut

Creates a shortcut to AutoCAD with the appropriate param's on the desktop

 

VxGetShortCutTargPaths

Returns all shortcut target paths according to the arguments

 

VxGetShortName

Returns the short path/name used by programs that require the earlier 8.3...

  • Vote tăng 12

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn Nataca rất nhiều, các hàm VL rất hay và rất bổ ích.

Nhân đây cho Tue_NV hỏi tí :

Mình chưa hiểu về Vla-object. Bạn và mọi người có thể giải thích cho mình một chút về loại đối tượng này không?

Thanks

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cám ơn Nataca rất nhiều, các hàm VL rất hay và rất bổ ích.

Nhân đây cho Tue_NV hỏi tí :

Mình chưa hiểu về Vla-object. Bạn và mọi người có thể giải thích cho mình một chút về loại đối tượng này không?

Thanks

Chào Tue_NV.

Cách chuyển đối tượng CAD sang kiểu Vla-object : dùng hàm (vlax-ename->vla-object CADEnt)

ví dụ :

(repeat (sslength ss)

(setq ent (vlax-ename->vla-object (ssname ss i) ))

.................

)

dòng này chắc bạn quá quen rồi

(repeat (sslength ss)

(setq ent (ssname ss i))

..............

)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào Tue_NV.

Cách chuyển đối tượng CAD sang kiểu Vla-object : dùng hàm (vlax-ename->vla-object CADEnt)

ví dụ :

(repeat (sslength ss)

(setq ent (vlax-ename->vla-object (ssname ss i) ))

.................

)

dòng này chắc bạn quá quen rồi

(repeat (sslength ss)

(setq ent (ssname ss i))

..............

)

Chào bạn Nataca

Chào anh giabach

 

Vấn đề trên thì Tue_NV đã hiểu. Nhưng phải có mục đích gì đó thì người ta mới chuyển đối tượng CAD sang kiểu Vla-object . Cho Tue_NV hỏi thêm một chút là mục đích khi chuyển đối tượng CAD sang kiểu Vla-object để làm gì vậy?

Cám ơn bạn Nataca, gia bách thật nhiều

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cám ơn Nataca rất nhiều, các hàm VL rất hay và rất bổ ích.

Nhân đây cho Tue_NV hỏi tí :

Mình chưa hiểu về Vla-object. Bạn và mọi người có thể giải thích cho mình một chút về loại đối tượng này không?

Thanks

Theo em hiểu thì Vla là Visual lisp activeX. Từ phiên bản cad14 trở về trước thì chỉ có ngôn ngữ Autolisp tích hợp trong cad. Cụ tổ của ngôn ngữ Visual lisp là Vital lisp. Autodesk đã mua lại bản quyền và biến Vital lisp thành visual lisp và tích hợp trong các phiên bản Cad từ 200 trở về sau. Trong quá trình tích hợp để thành 1 phần của Autocad thì Vital lisp đã có sự biến đổi đôi chút, tuy nhiên về cơ bản thì không thay đổi nhiều. Mặc dù có sự xuất hiện của ngôn ngữ visual lisp nhưng Autolisp không hề bị vứt bỏ đi mà 2 ngôn ngữ này được kết hợp với nhau cùng hỗ trợ cho Autocad. Ename là đối tượng cơ bản của Autolisp, và Object là đối tượng cơ bản của Visual lisp. Chính vì thế khi anh chuyển ename ->object thì tức là anh đã đổi dạng đối tượng để dùng được ngôn ngữ Visual lisp. Nó chỉ là cách đặt tên khác nhau của 1 đối tượng. Đối tượng đó không hề thay đổi (kể cả VBA, C++ cũng thế). Vậy tại sao ta vẫn dùng 2 ngôn ngữ Autolisp và Visual lisp trong 1 bài toán? Vì mỗi cái có 1 thế mạnh riêng, ta kết hợp cả 2 ngôn ngữ này sẽ giúp giải bài toán một cách nhanh và ngắn gọn nhất. Ví dụ việc chọn đối tượng trong Autolisp rất đơn giản nhưng trong Visual lisp khá phức tạp và khó khăn, trong khi việc lấy layer của 1 đối tượng chẳng hạn, thì Visual lisp lấy rất đơn giản, trực quan (vla-get-layer obj) không phải nhớ những dãy DXF lằng nhằng như thằng Autolisp. Chưa nói đến việc áp dụng công nghệ ActiveX làm cho Visual lisp được mở rộng rất nhiều cách giải một bài toán (gần như chẳng thua gì thằng VBA), thư viện hàm được mở rộng rất nhiều.

Đấy là những gì em hiểu được qua quá trình mày mò tự đọc sách. Có gì hiểu chưa đúng mong các anh chỉ bảo :(

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Theo em hiểu thì Vla là Visual lisp activeX.

 

Mình xin góp ý thêm:

Vì vba là ngôn ngữ hướng đối tượng khác với vlisp nên autocad mới bày thêm cái vla và vlax để bổ sung cho autolisp.

Cho nên sau tên hàm bạn sẽ đều thấy có tên đối tượng, thí dụ (vla-get-Linetype obj) chẳng hạn.

 

Mỗi đối tượng đều có các method và property riêng.

Muốn dùng method thì ghép vla- , chẳng hạn vla-IntersectWith

Muốn dùng lấy thông tin property của obj thì ghép vla-get- , chẳng hạn vla-get-Linetype

Muốn thay đổi thông tin property của obj thì ghép vla-put- , chẳng hạn vla-put-Linetype

 

Ở điểm này thì nó đơn giản hơn autolisp.

Bạn có thể coi thêm ở file acad_dev.chm->Activex and VBA reference->Object để biết các method và property.

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bác Nataca.

 

Nhân tiện đây cho em hỏi về các hàm vla. Sao em đọc trong cuốn Developer Documentation sao không thấy các hàm vla

chỉ thấy các hàm của Lisp, các hàm vl; vlax nhưng chẳng thấy các hàm vla đâu

Em muốn học về các hàm vla lắm. Mong các anh, các bác chỉ giúp em phải đọc các hàm vla ở đâu?

 

Em xin cảm ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn bác Nataca.

 

Nhân tiện đây cho em hỏi về các hàm vla. Sao em đọc trong cuốn Developer Documentation sao không thấy các hàm vla

chỉ thấy các hàm của Lisp, các hàm vl; vlax nhưng chẳng thấy các hàm vla đâu

Em muốn học về các hàm vla lắm. Mong các anh, các bác chỉ giúp em phải đọc các hàm vla ở đâu?

 

Em xin cảm ơn

 

Nó nằm trong phần VBA đó, bạn mở file acad_dev.chm trong thư mục help, phần

ActiveX and VBA reference->code examples có các ví dụ.

 

VBA và VLA dùng chung hàm với nhau (cùng tên hàm), chỉ khác cách viết thôi,

bạn phải "dịch" từ VBA sang VLA.

Td:

VBA có ThisDrawing.Application.ZoomAll thì bạn hiểu là dùng cái method ZoomAll của đối tượng Application.

 

Bạn viết lại như sau

(vla-ZoomAll (vlax-get-acad-object))

ở đây (vlax-get-acad-object) <=> ThisDrawing.Application

 

Khi là method thì bạn thêm vla-

Khi là properties thì bạn thêm vla-get- (để lấy property) hoặc vla-put- (để thay đổi property).

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Là học viên lớp học Autolisp Online, là thành viên "trung thành" của Cadviet cũng đc mấy năm_ nay mình đã biết đc đôi chút về lisp

Những lúc rảnh mình thường "đào bới" mò mẫm hòng kiếm đc vài củ lisp trang bị cho công việc & hy vọng đc cống hiến nhiều hơn cho CV !

 

Ngặt nỗi cứ động đến củ nào có hàm vla, vl ... là mình đuối, nay mò đến đây, mình muốn đặt vấn đề muốn đc các tiền nhân hãy mổ xẻ dần dần về chủ đề các hàm này. Có thể là "Mỗi ngày 1 hàm vla (vlax)" chẳng hạn !

 

Mong đc các cao nhân đi ngang qua để lại "bút tích" !!! _ Cảm ơn !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tôi đâu biết cái nào bạn biết rồi, cái nào bạn chưa biết. Nhỡ nhè cái bạn biết rồi mà nói thì đâm ra thừa. 

Tuy nhiên thấy các bạn nhiệt tình nên cũng giới thiệu cho bạn cái hàm vlax-curve-getClosestPointTo mà mấy cái lisp gần đây tôi hay dùng.

Dạng của nó là  (vlax-curve-getClosestPointTo doituong diem [nil t]) 

Mục đích là lấy điểm nằm trên curve gần với điểm cho trước nhất (hay còn gọi là điểm thẳng góc ngắn nhất)

Để minh họa thì bạn hãy vẽ 1 line, 1 pline, 1 arc, 1 circle hay bất cứ dtg nào bạn muốn (trừ block) rồi chạy cái lsp dưới đây.

Nó sẽ vẽ 2 đường : màu đỏ với tham số nil và màu vàng với tham số t.

 

(defun c:test ()
  (setq a (car (entsel "\nChon doi tuong:"))
b (getpoint "\nChon diem:"))
  (entmake (list (cons 0 "LINE") (cons 10 b) (cons 11 (vlax-curve-getClosestPointTo a b))
(cons 62 1)))
  (entmake (list (cons 0 "LINE") (cons 10 b) (cons 11 (vlax-curve-getClosestPointTo a b t))
(cons 62 2)))
)
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thank Tot77 !

Bác co´ thể khái qua´t vêˋ vla put, vla get giˋ giˋ đo´ vaˋ cho vd cụ thể (càng nhiều vd càng phê) ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đánh lệnh vlide, bấm f1, vào ActiveX and VBA reference > Objects > Line object. Bên phần Properties bạn thấy 1 dãy. Tất cả những cái đó đều có thể ghép với vla-get- để biết thuộc tính của line, nhưng chỉ 1 số có thể ghép với vla-put- để thay đổi thuộc tính. Muốn biết cái nào dùng dc với vla-put- thi bạn cứ ghép thử, thấy cái nào chuyển màu xanh là ok, còn màu đen là not ok.

Dưới đây là lsp test, tôi chỉ lấy vài cái prop đẻ thử thôi. bạn vẽ 1 line rồi chạy lsp.

 

(defun c:test ()
  (defun v2p (a)  (vlax-safearray->list (vlax-variant-value a)))
  (setq a (car (entsel "\nChon Line:"))
obj (vlax-ename->vla-object a))
  (alert  (strcat "\nAngle : " (rtos (vla-get-Angle obj))
 "\nDelta : " (vl-prin1-to-string (v2p (vla-get-Delta obj)))
 "\nLength : " (rtos (vla-get-Length obj))
 "\nStartPoint : " (vl-prin1-to-string (setq dd (v2p (vla-get-StartPoint obj))))
 "\nEndPoint : " (vl-prin1-to-string (setq dc (v2p (vla-get-EndPoint obj))))
 "\nLayer : " (vla-get-Layer obj)
 "\nLinetype : " (vla-get-Linetype obj)
 "\nLinetypeScale : " (rtos (vla-get-LinetypeScale obj))
 "\nLineweight : " (rtos (vla-get-Lineweight obj))      
   ))
  (vla-put-StartPoint obj (vlax-3d-point (polar dd 0 1)))
  (vla-put-EndPoint obj (vlax-3d-point (polar dc 0 -1)))
  (alert  (strcat "\nNew StartPoint : " (vl-prin1-to-string  (v2p (vla-get-StartPoint obj)))
 "\nNew EndPoint : " (vl-prin1-to-string  (v2p (vla-get-EndPoint obj)))))
)
  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Đánh lệnh vlide, bấm f1, vào ActiveX and VBA reference > Objects > Line object. Bên phần Properties bạn thấy 1 dãy. Tất cả những cái đó đều có thể ghép với vla-get- để biết thuộc tính của line, nhưng chỉ 1 số có thể ghép với vla-put- để thay đổi thuộc tính. Muốn biết cái nào dùng dc với vla-put- thi bạn cứ ghép thử, thấy cái nào chuyển màu xanh là ok, còn màu đen là not ok.

Dưới đây là lsp test, tôi chỉ lấy vài cái prop đẻ thử thôi. bạn vẽ 1 line rồi chạy lsp.

 

(defun c:test ()
  (defun v2p (a)  (vlax-safearray->list (vlax-variant-value a)))
  (setq a (car (entsel "\nChon Line:"))
obj (vlax-ename->vla-object a))
  (alert  (strcat "\nAngle : " (rtos (vla-get-Angle obj))
 "\nDelta : " (vl-prin1-to-string (v2p (vla-get-Delta obj)))
 "\nLength : " (rtos (vla-get-Length obj))
 "\nStartPoint : " (vl-prin1-to-string (setq dd (v2p (vla-get-StartPoint obj))))
 "\nEndPoint : " (vl-prin1-to-string (setq dc (v2p (vla-get-EndPoint obj))))
 "\nLayer : " (vla-get-Layer obj)
 "\nLinetype : " (vla-get-Linetype obj)
 "\nLinetypeScale : " (rtos (vla-get-LinetypeScale obj))
 "\nLineweight : " (rtos (vla-get-Lineweight obj))      
   ))
  (vla-put-StartPoint obj (vlax-3d-point (polar dd 0 1)))
  (vla-put-EndPoint obj (vlax-3d-point (polar dc 0 -1)))
  (alert  (strcat "\nNew StartPoint : " (vl-prin1-to-string  (v2p (vla-get-StartPoint obj)))
 "\nNew EndPoint : " (vl-prin1-to-string  (v2p (vla-get-EndPoint obj)))))
)

Cái này hay quá, các bác ơi nổ tiếp để em học hỏi với 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào các anh chị,

Lâu rồi không thấy ai động đậy gì đến Topic này nên em mạn phép hâm nóng lại tí  

Mong các cao thủ tung vài chiêu để  lớp đàn em đi sau như bọn em Có thể là  học "Mỗi ngày 1 hàm vla (vlax)" !

Như a Hieprttr đã nói ^^

@a hiepttr học được chiêu mô chỉ bảo em mò mẫm với :)

Hóng tin ae!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×