vietanh2108
-
Số lượng nội dung
24 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
2
Bài đăng được đăng bởi vietanh2108
-
-
Lệnh find của CAD chậm và rất mất thời gian bác ạ ^^... em kiếm được lisp này quan trọng là muốn điều chỉnh ý số 1/ á!
-
Chào các bác, em tìm lisp này nhưng muốn nhờ mọi người sửa 1 chút. Lisp có chức năng tìm kiếm Att với nội dung cụ thể trong bản vẽ.
1/ Sau khi tìm được các đội tượng -> Thêm chức năng Add các đối tượng đã tìm đc vào Selection set hiện hành nếu bấm ESC để thoát lệnh.
2/ Nếu mở rộng chức năng tìm được cả TEXT, MTEXT thì tốt quá.
Em xin cám ơn trước!
(defun c:find-att (/ ov ss i en ed an ad ah) (while (not ov) (setq ov (getstring t "\nATTRIB Value To Search For: "))) (and (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 66 1) (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE"))))))) (setq i (sslength ss)) (while (not (minusp (setq i (1- i)))) (setq en (ssname ss i) ed (entget en) an (entnext en)) (while (/= "SEQEND" (cdr (assoc 0 (entget an)))) (setq ad (entget an) ah (cdr (assoc 40 ad)) an (entnext an)) (if (= (strcase ov) (strcase (cdr (assoc 1 ad)))) (progn (command "_.ZOOM" "_C" (cdr (assoc 10 ed)) (* ah 66)) ;(redraw en 3) (getstring "\nPress Enter To Continue Searching...")))))) ;(redraw) (prin1)) -
Mình thấy chức năng Overkill của autocad rất hay, tuy nhiên mỗi lần sử dụng là nó tự động xóa và merge các đối tượng tự động không qua quyết định của người dùng. Mình muốn tìm cách xét overkill như vậy nhưng không xóa mà đưa các đối tượng trùng vào selection set của autocad, mong các pro giúp đỡ! :)
-
Bạn tham khảo thử! :)
Function UnformatMtext(S As String) As String Dim P1 As Integer Dim P2 As Integer, P3 As Integer Dim intStart As Integer Dim strCom As String Dim strReplace As String Debug.Print S Select Case Left(S, 4) Case "\A0;", "\A1;", "\A2;" S = Mid(S, P1 + 5) End Select intStart = 1 Do P1 = InStr(S, "%%") If P1 = 0 Then Exit Do Else Select Case Mid(S, P1 + 2, 1) Case "P" S = Replace(S, "%%P", "+or-") Case "D" S = Replace(S, "%%D", " deg") End Select End If Loop Do P1 = InStr(intStart, S, "\", vbTextCompare) If P1 = 0 Then Exit Do strCom = Mid(S, P1, 2) Select Case strCom Case "\p" P2 = InStr(1, S, ";") S = Mid(S, P2 + 1) Case "\A", "\C", "\f", "\F", "\H", "\Q", "\T", "\W" P2 = InStr(P1 + 2, S, ";", vbTextCompare) P3 = InStr(P1 + 2, S, strCom, vbTextCompare) If P3 = 0 Then S = Left(S, P1 - 1) & Mid(S, P2 + 1) End If Do While P3 > 0 P2 = InStr(P3, S, ";", vbTextCompare) S = Left(S, P3 - 1) & Mid(S, P2 + 1) 'Debug.Print s, strCom P3 = InStr(1, S, strCom, vbTextCompare) Loop 's = Left(s, P3 - 1) & mid(s, P3 + 1) Case "\L", "\O" Dim strLittle As String strLittle = LCase(strCom) P2 = InStr(P1 + 2, S, strLittle, vbTextCompare) S = Left(S, P1 - 1) & Mid(S, P1 + 2, P2 - (P1 + 2)) & Mid(S, P2 + 2) Case "\S" P2 = InStr(P1 + 2, S, ";", vbTextCompare) P3 = InStr(P1 + 2, S, "/", vbTextCompare) If P3 = 0 Or P3 > P2 Then P3 = InStr(P1 + 2, S, "#", vbTextCompare) End If If P3 = 0 Or P3 > P2 Then P3 = InStr(P1 + 2, S, "^", vbTextCompare) End If S = Left(S, P1 - 1) & Mid(S, P1 + 2, P3 - (P1 + 2)) _ & "/" & Mid(S, P3 + 1, (P2) - (P3 + 1)) & Mid(S, P2 + 1) Case "\U" strLittle = Mid(S, P1 + 3, 4) Debug.Print strLittle Select Case strLittle Case "2248" strReplace = "ALMOST EQUAL" Case "2220" strReplace = "ANGLE" Case "2104" strReplace = "CENTER LINE" Case "0394" strReplace = "DELTA" Case "0278" strReplace = "ELECTRIC PHASE" Case "E101" strReplace = "FLOW LINE" Case "2261" strReplace = "IDENTITY" Case "E200" strReplace = "INITIAL LENGTH" Case "E102" strReplace = "MONUMENT LINE" Case "2260" strReplace = "NOT EQUAL" Case "2126" strReplace = "OHM" Case "03A9" strReplace = "OMEGA" Case "214A" strReplace = "PROPERTY LINE" Case "2082" strReplace = "SUBSCRIPT2" Case "00B2" strReplace = "SQUARED" Case "00B3" strReplace = "CUBED" End Select S = Replace(S, "\U+" & strLittle, strReplace) Case "\~" S = Replace(S, "\~", " ") Case "\\" intStart = P1 + 2 S = Replace(S, "\\", "\") GoTo Selectagain Case "\P" intStart = P1 + 1 GoTo Selectagain Case Else Exit Do End Select Selectagain: Loop Do P1 = InStr(1, S, "\P", vbTextCompare) If P1 = 0 Then Exit Do Else S = Left(S, P1 - 1) & vbCrLf & Mid(S, P1 + 2) End If Loop For intStart = 0 To 1 If intStart = 0 Then strCom = "}" Else strCom = "{" End If P2 = InStr(1, S, strCom) Do While P2 > 0 S = Left(S, P2 - 1) & Mid(S, P2 + 1) P2 = InStr(1, S, strCom) Loop Next intStart UnformatMtext = S End Function Sub Testmt() Dim Mt As AcadMText, V As Variant ThisDrawing.Utility.GetEntity Mt, V, "Pick an Mtext:" Debug.Print Mt.TextString Mt.TextString = UnformatMtext(Mt.TextString) Debug.Print Mt.TextString End Sub-
1
-
-
Đối với hình đơn giản thì có thể dùng BO hay hatch, tuy nhiên lại phải tốn qua nhiều bước trung gian, hơn nữa máy chạy rất nặng, tốn tài nguyên ko cần thiết để xác định vùng kín... ở đây e chỉ cần break cái polyline ngay tại giao điểm và sau đó nối nó lại bằng cái đường cắt thôi.
Có những công việc lập đi lập lại nhiều lần, nếu có thể sử dụng lisp sẽ tiết kiệm thời gian và tăng năng suất mà! Không phải lisp được tạo ra cho mục đích này sao !? :)
-
Em muốn xin list từ 1 polyline kín có thể tách ra thành 2 polyline kín bằng 1 đường polyline khác như hình bên dưới. Bác nào đi ngang qua biết thì giúp em với, em xin cám ơn trước!

-
Cám ơn bác, nhanh gọn lẹ và vô cùng chính xác! ^^
-
Chào mọi người, em có đoạn lisp phía dưới đưa số lượng đối tượng đã chọn vào clipboard để việc còn lại chỉ là Ctrl+V để lấy số liệu. H e muốn nhờ mn sửa dùng để có thể lấy tên layer của đối tượng đầu tiên trong nhóm đối tượng đã chọn đưa vào clipboard tương tự thế này.
Cho e cám ơn trước! :)
(defun C:f1 ( / SS ) (and (setq SS (vl-some 'ssget (list "_I" nil))) (_SetClipBoardText (itoa (sslength SS))) ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun _SetClipBoardText ( text / htmlfile result ) ;; Caller's sole responsibility is to pass a ;; text string. Anything else? Pie in face. ;; Attribution: Reformatted version of ;; post by XShrimp at theswamp.org. ;; ;; See http://tinyurl.com/2ngf4r. (setq result (vlax-invoke (vlax-get (vlax-get (setq htmlfile (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'SetData "Text" text ) ) (vlax-release-object htmlfile) text ) -
http://www.kimprojects.com/a-much-better-select-similar-autocad/
Em kiếm được lisp này quá hay và tiện, tuy nhiên em muốn sửa chút chút, mong bác nào đi qua giúp dùm tí. Ở select block nếu mà bổ sung thêm tính năm chỉ chọn các block có cùng tag value vs block mẫu thì hay quá!
-
Em sử dụng được rồi!!! cám ơn 2 bác nhiều... :D
-
1
-
-
Sao em sử dụng nó cứ báo lỗi thế này ko bác ơi!! :(

-
Cảm ơn bác đã quan tâm, nhưng mà sử dụng file excel này còn nhiều hạn chế với em! kiểu e vẫn phải bật lên cóp handle qua tool này, thêm nữa nó chưa hỗ trợ 1 list các handle như thớt e nhờ á ^^
-
Em tìm được lisp này trên mạng với chức năng highlight và zoom tới đối tượng có Handle ID tương ứng. Nhờ bác nào đi qua giúp em thêm chức năng làm việc vơi 1 và cả với nhiều ID với.
Kiểu như em có list ID
A;B;C;D...
thì nó hightlight và zoom tất cả các đối tượng có ID trong chuỗi ngăn cách bởi ";"
Em xin chân thành cám ơn. :D
P/s: zhid để zoom tới, còn chid để tạo text ID của đối tượng.
;Zoom to handle ID (defun c:zhid ( / YourHandle ll ur ) (vl-load-com) (setq YourHandle (getstring "\nEnter Handle: ")) (if (handent YourHandle) (progn (vla-getboundingbox (vlax-ename->vla-object (handent YourHandle)) 'll 'ur) (vla-zoomwindow (vlax-get-acad-object) ll ur) (sssetfirst nil (ssadd (handent YourHandle))) ) (princ "\nHandle not in drawing") ) (princ) ) ;Tao Handle ID (defun c:chid (/ ss n ed sz) (setq sz (getvar 'TextSize)) (prompt "Select objects: ") (if (and (setq ss (ssget)) (setq n (sslength ss))) (while (>= (setq n (1- n)) 0) (setq ed (entget (ssname ss n))) (entmake (list '(0 . "TEXT") (assoc 10 ed) (cons 1 (cdr (assoc 5 ed))) (cons 40 sz) ) ) ) ) (princ) )-
1
-
-
Đơn giản, hiệu quả, nhanh gọn quá!!! e cám ơn bác nhiều :D
-
Em tìm được lisp này trên mạng của thánh Lêmác cơ mà bị cái kẹt nó đang chọn tất cả các block trên Model. Em muốn nhờ các bác sửa tí xíu thôi, mong ai đi ngang qua giúp cho.
- Lọc các Block ở vùng chọn selectonscreen thay vì toàn model
Em xin cám ơn các bác đã quan tâm chủ đề trên! :D
;; Select Blocks by Attribute Value - Lee Mac ;; Selects all attributed blocks in the current layout which contain a specified attribute value. (defun c:selblkbyattval ( / att atx ent idx sel str ) (if (/= "" (setq str (strcase (getstring t "\nSpecify attribute value: ")))) (if (and (setq sel (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model") ) ) ) ) (progn (repeat (setq idx (sslength sel)) (setq ent (ssname sel (setq idx (1- idx))) att (entnext ent) atx (entget att) ) (while (and (= "ATTRIB" (cdr (assoc 0 atx))) (not (wcmatch (strcase (cdr (assoc 1 atx))) str)) ) (setq att (entnext att) atx (entget att) ) ) (if (= "SEQEND" (cdr (assoc 0 atx))) (ssdel ent sel) ) ) (< 0 (sslength sel)) ) ) (sssetfirst nil sel) (princ (strcat "\nNo blocks found with attribute value matching \"" str "\".")) ) ) (princ) )
-
1
-
1
-
-
hjx, em đi khắp nơi lục lọi mà toàn thấy từ Excel qua CAD là nhiều... cho em lại đề một chút! có cách nào thay thế được Data Extraction bằng VBA ko, ý là có 1 file Excel vs 1 button, bấm 1 phát là nhảy qua CAD cho phép chọn quét các attrblock cần thiết về ra được các cột
- Số lượng
- Layer name
- Tên block
- Attr 1
- Attr 2
....
- Attr n
Bác nào giúp em với, em xin cảm ơn trước!!!!
cám ơn bác! ý em là sửa lại giúp em theo ý tưởng ở trên á!!! ^^
-
hjx, em đi khắp nơi lục lọi mà toàn thấy từ Excel qua CAD là nhiều... cho em lại đề một chút! có cách nào thay thế được Data Extraction bằng VBA ko, ý là có 1 file Excel vs 1 button, bấm 1 phát là nhảy qua CAD cho phép chọn quét các attrblock cần thiết về ra được cột
- Số lượng
- Layer name
- Tên block
- Attr 1
- Attr 2
....
- Attr n
Bác nào giúp em với, em xin cảm ơn trước!!!!
BTW, e có kiếm đc 1 file VBA trên mạng với macro Extract tất cả các block trong bản vẽ, bác nào đi qua sửa lại giúp em với
-
1
-
-
hjx, em đi khắp nơi lục lọi mà toàn thấy từ Excel qua CAD là nhiều... cho em lại đề một chút! có cách nào thay thế được Data Extraction bằng VBA ko, ý là có 1 file Excel vs 1 button, bấm 1 phát là nhảy qua CAD cho phép chọn quét các attrblock cần thiết về ra được các cột
- Số lượng
- Layer name
- Tên block
- Attr 1
- Attr 2
....
- Attr n
Bác nào giúp em với, em xin cảm ơn trước!!!!
-
1
-
-
Data extraction và -dataextraction thì hay quá nhưng bị cái phiền phức và nhiều bước lựa chọn khi hiện dialog.
- Mn có thì cho em xin lisp nào chọn các block cần r bấm 1 phát là nhảy ra bảng Excel BookN.xls xuất hết tất cả các attribute, layer name và combine lại nếu giống nhau như data extraction thì em xin đội ơn ạ!!! :D
-
Cám ơn các bác đã góp ý cho em học hỏi đc thêm nhiều điều, em có một mong muốn cải tiến nho nhỏ cái líp trên nữa.. giúp em viết thêm 2 dòng này với
- Lấy màu của Text đối tượng để đưa vào màu cho block vừa insert vào.
- Nếu ko có block "CODE_COL" trong bản vẽ thì báo về "Chua khoi tao block CODE_COL".
Em xin cám ơn!!!!
-
Bạn sử dụng lệnh FIND của CAD cũng được, tuy nhiên nhược điểm là gọi lệnh này sẽ hiện Dialog và mất thời gian load. Góp vui cho bạn một LISP tìm và thay thế tự động!
;superstr.lsp l. gabriel 11-11-1996 22:04:42 ; ;object: string search and replace. Works for both text and attributes. Program ; will globally search and replace every text/attribute within the selection set. ; ;Rev 1.0 Added Dimension string search and replace l. gabriel 06.12.08 ; (defun atext (num) (cdr (assoc num d)) ) ; (defun echooff () (setq oldecho (getvar "CMDECHO")) (setq oldblip (getvar "BLIPMODE")) (setq oldosm (getvar "OSMODE")) (setvar "CMDECHO" 0) (setvar "BLIPMODE" 0) (setvar "OSMODE" 0) (setq olderror_echo *ERROR*) (terpri) (defun *ERROR* (msg) (princ " \n") (princ msg) (echoon) ) ) ; (defun echoon () (setvar "CMDECHO" oldecho) (setvar "BLIPMODE" oldblip) (setvar "OSMODE" oldosm) (setq *ERROR* olderror_echo) (princ) ) ;super search and replace routine (defun c:FEQ() (echooff) (setq olsosmode (getvar "OSMODE")) (setvar "OSMODE" 0) (setq p (ssget)) (if p (progn (setq osl (strlen (setq os (getstring "\nOld string: " t)))) (setq nsl (strlen (setq ns (getstring "\nNew string: " t)))) (setq l 0 chm 0 n (sslength p)) (setq adj (cond ((/= osl nsl) (- nsl osl)) (T nsl) ) ) (while (< l n) (setq d (entget (setq e (ssname p l)))) (if (and (= (atext 0) "INSERT")(= (atext 66) 1)) (progn (setq e (entnext e)) (while e (setq d (entget e)) (cond ((= (atext 0) "ATTRIB") (setq chf nil si 1) (setq s (cdr (setq as (assoc 1 d)))) (while (= osl (setq sl (strlen (setq st (substr s si osl))))) (cond ((= st os) (setq s (strcat (substr s 1 (1- si)) ns (substr s (+ si osl)))) (setq chf t) (setq si (+ si adj)) ) ) (setq si (1+ si)) ) (if chf (progn (setq d (subst (cons 1 s) as d)) (entmod d) (entupd e) (setq chm (1+ chm)) ) ) (setq e (entnext e)) ) ((= (atext 0) "SEQEND") (setq e nil)) (T (setq e (entnext e))) ) ) ) ) (if (= "MTEXT" ; Look for MTEXT entity type (group 0) (cdr (assoc 0 (setq e (entget (ssname p l)))))) (progn (setq chf nil si 1) (setq s (cdr (setq as (assoc 1 e)))) (while (= osl (setq sl (strlen (setq st (substr s si osl))))) (if (= st os) (progn (setq s (strcat (substr s 1 (1- si)) ns (substr s (+ si osl)))) (setq chf t) ; Found old string (setq si (+ si nsl)) ) (setq si (1+ si)) ) ) (if chf (progn ; Substitute new string for old (setq e (subst (cons 1 s) as e)) (entmod e) ; Modify the TEXT entity (setq chm (1+ chm)) )) ) ) (if (= "DIMENSION" ; Look for DIMENSION entity type (group 0) (cdr (assoc 0 (setq e (entget (ssname p l)))))) (progn (setq chf nil si 1) (setq s (cdr (setq as (assoc 1 e)))) (while (= osl (setq sl (strlen (setq st (substr s si osl))))) (if (= st os) (progn (setq s (strcat (substr s 1 (1- si)) ns (substr s (+ si osl)))) (setq chf t) ; Found old string (setq si (+ si nsl)) ) (setq si (1+ si)) ) ) (if chf (progn ; Substitute new string for old (setq e (subst (cons 1 s) as e)) (entmod e) ; Modify the TEXT entity (setq chm (1+ chm)) )) ) ) (if (= "TEXT" ; Look for TEXT entity type (group 0) (cdr (assoc 0 (setq e (entget (ssname p l)))))) (progn (setq chf nil si 1) (setq s (cdr (setq as (assoc 1 e)))) (while (= osl (setq sl (strlen (setq st (substr s si osl))))) (if (= st os) (progn (setq s (strcat (substr s 1 (1- si)) ns (substr s (+ si osl)))) (setq chf t) ; Found old string (setq si (+ si nsl)) ) (setq si (1+ si)) ) ) (if chf (progn ; Substitute new string for old (setq e (subst (cons 1 s) as e)) (entmod e) ; Modify the TEXT entity (setq chm (1+ chm)) )) ) ) (setq l (1+ l)) ) ) ) (if (> chm 1) (princ (strcat "\nUpdated " (itoa chm) " text strings")) (princ (strcat "\nUpdated " (itoa chm) " text string")) ) (setvar "OSMODE" oldosmode) (terpri) (echoon) )-
1
-
-
Hì hì hì, Cám ơn bác Bee nhiều nhiều, em tìm nát google mà không có chút manh mốt nào, bác code giúp em vài dòng là xong ngay :D Xin đa tạ, đa tạ!!!!!
-
Thưa các bác, kiểu là em có sẵn 1 block CODE_COL vs 4 attribute
-Tên_cột
-Cao_đáy
-Cao_đỉnh
-Trừ_cao
và mặt bằng có text tên cột C1, C2... Cn. Em muốn chọn tất cả các text tên cọc và chạy LISP để biến tất cả các text tên cột đó thành block CODE_COL vs tên cột được đưa vào attribute Tên_cột... bác nào đi qua giúp dùm em với, em xin cám ơn trc!
[Yêu cầu] Chọn các đối tượng trong lisp
trong AutoLisp
Đã đăng · Trả lời báo cáo
Em cám ơn Mod Danh Cong rất nhiều ạ! ^^