Tue_NV
-
Số lượng nội dung
4260 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
288
Bài đăng được đăng bởi Tue_NV
-
-
Câu hỏi phụ : Bạn tìm đọc thêm các ename và các mã dxf của nó (Các bài viết trên diễn đàn khá nhiều)
Câu 2 :
Bạn tham khảo code Chọn dim -> Thông báo EXTLINE1 là on hay off(defun c:ttt() (setq en (car(entsel "Chon dimension"))) (alert (if (= 0 (vlax-get (vlax-ename->vla-object en) 'ExtLine1Suppress) ) "EXT Line 1 = ON" "EXT Line 1 = OFF") ) )
-
-
-
12 giờ trước, SAGI-Viz đã nói:Chào mọi người,
Câu 1: Cho em hỏi có cách nào để mình lọc giữa các loại đối tượng mà mình đã ssget một lần quét chọn nhiều loại đối tượng được không ah?
Cụ thể như sau:
(setq ss3 (ssget ":L" '((0 . "MTEXT,DIMENSION"))))
Em dùng code trên để quét chọn một lần 2 loại đối tượng trong vùng chọn là Mtext và Dimension.
-> Em muốn tách ra 2 tập biến gồm Mtext và Dimension riêng lẽ để xử lý được không ah?
Câu 2: Em muốn tìm lọc các đối tượng là Dimension có properties chân dim Ext line 1 hoặc 2 là ON hoặc OFF.
Nhưng có dùng entget để lấy thông tin nhưng không thấy có properties đó. -> Cho em hỏi có cách nào khác không ah?
Khi có nhóm đối tượng Dimension rồi em muốn tác động thay đổi các biến trong Properties như Dim Style, hoặc gán lại Ext line 1/2 hoặc Dim scale trong bảng Properties làm được không ah?
Em cảm ơn nhiều ah.
Mình xin trả lời sau:
Câu 1: Muốn tách ra 2 list Mtext và Dimension thì duyệt qua các ename trong ss3
-> Ename nào là Mtext thì đưa vào List L1 và Ename nào là Dimension thì đưa vào list L2
Bạn có thể xử lý list L1 và L2
Câu 2 : Duyệt qua từng object Dimension -> Xem property của Dim là "ExtLine1Suppress" và "ExtLine2Suppress" . Nếu = 0 là ON, nếu = -1 là OFF
Kiểm tra và đưa vào 1 list
-> Có thể tác động các đối tương Dimension thông qua:
+ Biến hệ thống và lệnh DOV (DIMOVERRIDE)
+ Property của các object Dimension
-
10 giờ trước, lethanh2004 đã nói:Cảm ơn bác Tuệ đã quan tâm . nhưng bác cho em hỏi sao em load lisp lên lại không dùng được ạ ( em dùng cad 2007 ) . em cảm ơn
bạn thêm dòng (vl-load-com) vào đầu lisp là sử dụng được nhé
Viết thêm code bổ sung chọn nhiều đường cắt màu đỏ
1./ Chọn các đường cắt màu đỏ
2./ Chọn toàn bộ đường cần cắt. Quét hết (có thể trong đó bao gồm luôn cả đường cắt) thì lisp sẽ hoạt động
(vl-load-com) (defun c:trr(/ es1 e2 i en j lst-res ss1 ss) (defun Tue-geom-divpt (p1 p2 k) (polar p1 (angle p1 p2) (* (distance p1 p2) k)) ) (defun Tue-list-tach (lst count / i j Lst-tinh Reslis) ;;;;;Ex: (Tue-list-tach '(1 5 4 6 3 5) 2)--> ((1 5) (4 6) (3 5)) ;;;;;;;;;(Tue-list-tach '(1 5 4 6 3 5) 3)--> ((1 5 4) (6 3 5)) ;;;;;;;;;(Tue-list-tach '(1 5 4 6 3 5) 5)--> nil (setq i 0 j 0) (while (and (< i (/ (length lst) count)) (= (rem (length lst) count) 0)) (Repeat count (setq Lst-tinh (append Lst-tinh (list (nth j lst)) )) (setq j (1+ j)) ) (setq Reslis (append Reslis (list Lst-tinh)) Lst-tinh nil) (setq i (1+ i)) ) Reslis ) (defun Tue-geom-inters(e1 e2 flag / Lst_tong Lst);;;Tue-list-tach ;;; flag= 0 : acExtendNone Does not extend either object. ;;; flag= 1 : acExtendThisEntity Extends the base object. ;;; flag= 2 : acExtendOtherEntity Extends the object passed as an argument. ;;; flag= 3 : acExtendBoth Extends both objects. ;;Ex: (Tue-geom-inters (ssname (TUE-SS-ENTSEL '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")) "\npick chon doi tuong thu 1 :") 0) ;;;;;;;;;;;;;;;;;;;;;;;(ssname (TUE-SS-ENTSEL '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")) "\npick chon doi tuong thu 2 :") 0) 0) (if (= (type e1) 'ENAME) (setq e1 (vlax-ename->vla-object e1))) (if (= (type e2) 'ENAME) (setq e2 (vlax-ename->vla-object e2))) (Tue-list-tach (vlax-invoke e1 'IntersectWith e2 flag) 3) ) ;;;main (princ "chon cac duong cat: ") (setq ss1 (ssget '((0 . "*LINE"))) j -1 i -1 lst-res '()) (princ "chon cac duong can cat: ") (setq ss (ssget '((0 . "*LINE,ARC"))));;line cat (while (setq en (ssname ss (setq i (1+ i)))) (while (setq es1 (ssname ss1 (setq j (1+ j)))) (if (setq p1 (Tue-geom-inters es1 en 0)) (setq lst-res (append lst-res (List (car p1)))) ) ) (if (= (length lst-res) 2) (command "._break" en "non" (car lst-res) "non" (cadr lst-res)) ) (setq j -1 lst-res '()) ) )
-
Lâu ngày không viết nên ngứa ngáy tay chân.
Lisp của bạn đây : Lệnh TRR
(defun c:trr(/ e1 e2 i en) (defun Tue-geom-divpt (p1 p2 k) (polar p1 (angle p1 p2) (* (distance p1 p2) k)) ) (defun Tue-list-tach (lst count / i j Lst-tinh Reslis) ;;;;;Ex: (Tue-list-tach '(1 5 4 6 3 5) 2)--> ((1 5) (4 6) (3 5)) ;;;;;;;;;(Tue-list-tach '(1 5 4 6 3 5) 3)--> ((1 5 4) (6 3 5)) ;;;;;;;;;(Tue-list-tach '(1 5 4 6 3 5) 5)--> nil (setq i 0 j 0) (while (and (< i (/ (length lst) count)) (= (rem (length lst) count) 0)) (Repeat count (setq Lst-tinh (append Lst-tinh (list (nth j lst)) )) (setq j (1+ j)) ) (setq Reslis (append Reslis (list Lst-tinh)) Lst-tinh nil) (setq i (1+ i)) ) Reslis ) (defun Tue-geom-inters(e1 e2 flag / Lst_tong Lst);;;Tue-list-tach ;;; flag= 0 : acExtendNone Does not extend either object. ;;; flag= 1 : acExtendThisEntity Extends the base object. ;;; flag= 2 : acExtendOtherEntity Extends the object passed as an argument. ;;; flag= 3 : acExtendBoth Extends both objects. ;;Ex: (Tue-geom-inters (ssname (TUE-SS-ENTSEL '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")) "\npick chon doi tuong thu 1 :") 0) ;;;;;;;;;;;;;;;;;;;;;;;(ssname (TUE-SS-ENTSEL '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")) "\npick chon doi tuong thu 2 :") 0) 0) (if (= (type e1) 'ENAME) (setq e1 (vlax-ename->vla-object e1))) (if (= (type e2) 'ENAME) (setq e2 (vlax-ename->vla-object e2))) (Tue-list-tach (vlax-invoke e1 'IntersectWith e2 flag) 3) ) ;;;main (setq e1 (car(entsel "\n Chon duong cat 1 :"))) (setq e2 (car(entsel "\n Chon duong cat 2 :")) i -1) (if (setq ss (ssget '((0 . "*LINE,ARC")))) (while (setq en (ssname ss (setq i (1+ i)))) (if (and (= (length (setq p1 (Tue-geom-inters e1 en 0))) 1) (= (length (setq p2 (Tue-geom-inters e2 en 0))) 1)) (command "._trim" e1 e2 "" (Tue-geom-divpt (car p1) (car p2) 0.5) "") ) ) ) )
-
1
-
-
23 giờ trước, huunhantvxdts đã nói:Hàm này region không lấy được
Dump object region ra thì có method GetBoundingBox
Kiểm tra method GetBoundingBox thì lấy được Lấy tọa độ Bounding Box của REGION
Command: (vlax-dump-object o t)
; IAcadRegion2: AutoCAD Region Interface
; Property values:
; Application (RO) = #<VLA-OBJECT IAcadApplication 01bcb450>
; Area (RO) = 44.4943
; Centroid (RO) = (16.8518 5.56305)
; Document (RO) = #<VLA-OBJECT IAcadDocument 0d3e825c>
; EntityTransparency = "ByLayer"
; Handle (RO) = "1AC"
; HasExtensionDictionary (RO) = 0
..............................
; Methods supported:
; ArrayPolar (3)
; ArrayRectangular (6)
; Boolean (2)
; Copy ()
; Delete ()
; Explode ()
; GetBoundingBox (2)-
1
-
-
Bạn chú ý đặt Block ATT với thuộc tính Lock position là Yes thì tạo block dynamic visibiliti mới được nhé!
-
4 giờ trước, Doan Van Ha đã nói:@Danh Cong: nhập PEDITACCEPT = 1 rồi nói chuyện tiếp
- Theo mình kiểm chứng thì :
+ PEDITACCEPT =1 -> Không xuất hiện dòng Convert Lines and Arcs to polylines [Yes/No]
+ PEDITACCEPT =0 -> xuất hiện dòng Convert Lines and Arcs to polylines [Yes/No]
-> Không có liên quan gì đến "Fuzz Distance " đề cập đến đoạn nối cả
Ý là chỗ này Danh Cong:
Command: pe PEDIT
Select polyline or [Multiple]: m
Select objects: Specify opposite corner: 2 foundSelect objects:
Enter an option [Close/Open/Join/Width/Fit/Spline/Decurve/Ltype gen/Reverse/Undo]: j
Join Type = Extend
Enter fuzz distance or [Jointype] <0.00>: -
1 giờ} trướ}c, Danh Cong đã nói:Em suy nghĩ theo lỗi cổ điển, nên cứ theo trình tự rồi viết ạ. Mong bác gợi ý , do em ko hiểu vl-sort ename hoạt động như thế nào ?
1./ VL-sort các ename theo thứ tự điểm đầu các LINE theo phương X đấy em! Qua Vl-sort Tạo được List các ename có toạ độ theo thứ tự tăng dần theo phương X
2./ Duyệt vòng lặp qua các ename -> Lấy điểm có toạ độ Y thấp nhất -> Tạo list Y
3./ Tạo Pline qua list Y
-
1
-
-
@Danh Cong: 2 vòng lặp repeat , 1 vl-sort.
Bạn có thể vl-sort các ename trước rồi dùng 1 vòng lặp repeat mà :D
-
7 giờ trước, doductiep đã nói:cảm ơn bác! Nhưng đọc hết 2 trang mà chả hiểu gì ^_^
Túm lại là em muốn chọn điểm (1 trong 2 đầu pline) để hàm Vlax-curve - getpointatDist bắt đầu tính khoảng cách từ nó mà mình không cần biết nó là đầu hay là cuối pline.
E đang có ý là sau khi pick chọn 1 trong 2 đầu của pline rồi kiểm tra điểm pick có phải là điểm đầu không, nếu đúng => dùng hàm. Nếu không thì xuất tọa độ pl đó rồi vẽ 1 pline mới với list tọa độ đảo ngược, sau đó dùng hàm xác định điểm cần tìm trên Pline mới vì khi đó 2 pline trùng nhau, chỉ ngược nhau điểm đầu và cuối.
Có cách nào nhanh hơn không ah?
Nếu cần kiểm tra điểm pick có phải điểm đầu PLINE hay không thì so sánh điểm pick đó với Vlax-curve-getStartpoint và Vlax-curve-getEndpoint
-
XIN LISP HAY
trong Sử dụng AutoCAD
Bạn có thể upload cái lisp của bạn lên đây và nói rõ hơn được không?
-
57 phút trước, quocmanh04tt cho biết:Mr. Tue_NV chắc đang dùng x86. Với x64 thì gc:FieldCode không ổn. Tìm LM:fieldcode là ok ngay.
Hèn chi .... ^_^ Thank quocmanh04lt
Update lại lisp cho Conghoa nè!
-
1
-
-
Hôm qua mình test trên cad2012 ok . không biết cad khác có bị gì k?
-
Conghoa thử đoạn code này nhé!
(defun c:pci() (setvar "cmdecho" 0) (if (setq ss (ssget '((0 . "INSERT") (66 . 1)))) (progn (setq i -1 pre (getint "So chu so thap phan :")) (while (setq ename (ssname ss (setq i (1+ i)))) (setq obj (vlax-ename->vla-object ename)) (foreach x (vlax-invoke obj 'getattributes) (if (= (vla-get-HasExtensionDictionary x) :vlax-true) (progn (if (setq pos (vl-string-search "%pr" (setq str (vl-string-subst ">%" " 0>%" (gc:FieldCode (vlax-vla-object->ename x)))))) (vla-put-TextString x (setq tthe (strcat (substr str 1 (+ 3 pos)) (itoa pre) (VL-STRING-LEFT-TRIM "0123456789" (substr str (+ 4 pos)))))) ) (command "._updatefield" ename "") ) ) ) ) ) ) ) (defun gc:FieldCode (ent / foo elst xdict dict field str) (defun foo (field str / pos fldID objID) (setq pos 0) (if (setq pos (vl-string-search "\\_FldIdx " str pos)) (while (setq pos (vl-string-search "\\_FldIdx " str pos)) (setq fldId (entget (cdr (assoc 360 field))) field (vl-remove (assoc 360 field) field) str (strcat (substr str 1 pos) (if (setq objID (cdr (assoc 331 fldId))) (vl-string-subst (strcat "ObjId " (itoa (gc:EnameToObjectId objID))) "ObjIdx" (cdr (assoc 2 fldId)) ) (foo fldId (cdr (assoc 2 fldId))) ) (substr str (1+ (vl-string-search ">%" str pos))) ) ) ) str ) ) ;;--------------------------------------------------------;; (setq elst (entget ent)) (if (and (member (cdr (assoc 0 elst)) '("ATTRIB" "MTEXT" "TEXT")) (setq xdict (cdr (assoc 360 elst))) (setq dict (dictsearch xdict "ACAD_FIELD")) (setq field (dictsearch (cdr (assoc -1 dict)) "TEXT")) ) (setq str (foo field (cdr (assoc 2 field)))) ) ) ;;============================================================;; ;; gc:EnameToObjectId (gile) ;; Returns the object ID from an ename ;; ;; Argument : a ename (as returned by enlast, entsel ...) (defun gc:EnameToObjectId (ename) ((lambda (str) (hex2dec (substr (vl-string-right-trim ">" str) (+ 3 (vl-string-search ":" str))) ) ) (vl-princ-to-string ename) ) ) ;;============================================================;; ;; hex2dec (gile) ;; Converts an hexadecimal to a decimal ;; ;; Argument : an hexadecimal (string) ;; Return : an integer (defun hex2dec (s / r l n) (setq r 0 l (vl-string->list (strcase s))) (while (setq n (car l)) (setq l (cdr l) r (+ (* r 16) (- n (if (<= n 57) 48 55))) ) ) )-
1
-
-
-
5 phút trước, timmaimotnguoi cho biết:Thế anh cho e hỏi:
Tức là hàm đó không phân biệt độ dài của list. nó chỉ đúng với list có kiểu text một bên và số một bên. còn text với số lẫn lộn là ko được ví dụ như. BV-HC-01/156
Cũng không hẳn. Do mình tuỳ biến mà. Nó có thể tách text với số lẫn lộn, cái hay là nó không phụ thuộc chiều dài string
Trước mắt bạn phải tìm hiểu rõ hàm đó hoạt động như thế nào thì mới vỡ ra được
-
Ngay bây giờ, timmaimotnguoi cho biết:Anh Tuệ cho e hỏi: hàm kia là nó tách text với số riêng ra luôn à anh?
Uh, nó tách thành 1 list gồm 2 phần tử đó
-
4 giờ trước, gia_bach cho biết:Text thi lập trình được, nhưng với block (attributes) không chắc lắm.
Conghoa dùng CAD phiên bản nào?
Về khả năng thì chắc chắn là block (attributes) có thể làm được anh ạ!
-
1
-
-
52 phút trước, hiepttr cho biết:Bác có thể set LTSCALE sysvar bằng một số lớn thật lớn, xong rồi trả lại
Bài toán đang quan tâm đến tốc độ xử lý nên việc sử dụng LTSCALE sysvar là cái không khả thi ^^
-
1
-
-
@timmaimotnguoi:
Bạn có thể nghiên cứu thêm hàm sau :
(defun tachchuoi (str / str1) (list (setq str1 (vl-string-right-trim "0 1 2 3 4 5 6 7 8 9" str)) (vl-string-left-trim str1 str) ) )
test:
Command: (TACHCHUOI "BH-BV-02")
("BH-BV-" "02")Command: (TACHCHUOI "BH-02")
("BH-" "02")Command: (TACHCHUOI "BH-1")
("BH-" "1")Command: (TACHCHUOI "BH-100")
("BH-" "100") -
Kịp thời}}, Thaistreetz cho biết:....
Mình nhớ trước đây khi nghiên cứu để viết mấy hàm con entmake object thì cấu trúc code dxf của đối tượng hatch có các thông tin sau:
1. Tên pattern (mẫu hatch) của đối tượng hatch.
2. Giá trị mô tả toàn bộ tập hợp vector cấu tạo ra mẫu pattern của đối tượng hatch.
....
Thai co thể gửi đường link tham khảo hàm con trên được không?
Thanks!
-
Thuê Viết Lisp
trong AutoLisp
1 giờ} trướ}c, danbrown0612 cho biết:Bạn có ở Hà Nội không? Mình đang có 1 vài ý tưởng viết lisp theo chuyên ngành cần tìm người hợp tác để hoàn thiện và tiến hành phân phối. Bạn có muốn tham gia không?
Bạn có thể nêu ý tưởng về chuyên ngành gì hay không?

Help .......nhờ các anh viết lisp ....về lệnh trim
trong AutoLisp
Đã đăng · Trả lời báo cáo
File chỉ gửi với 1 đối tương chỉ giao cắt với 2 điểm. nếu PLInE giao cắt nhiều điểm với dao cắt thì phải viết kiểu khác nữa