


damvinhduy
-
Số lượng nội dung
27 -
Đã tham gia
-
Lần ghé thăm cuối
Bài đăng được đăng bởi damvinhduy
-
-
Có lisp rồi. E trốn lun nhé.
Có lisp rồi sao không cảm ơn người ta hả bạn?
-
Bản vẽ VD đây . Bác Giúp em nhé!http://www.cadviet.c..._xap_text_1.dwg
Bạn dùng thử lisp này. Lệnh là TM dùng được cho Text lẩn MText. Have fun!
;;;============================[ TM.lsp ]=============================;;; ;;; Cong dung: ALign Text Middle =====================================;;; ;;; Version: 1.0 =====================================================;;; ;;; Create by damvinhduy =============================================;;; (defun C:TM (/ Txt PTxt PTX SS n OSMLAST lstpoint1 lstpoint2 pc pt pp) (vl-load-com) (setq SS (ssget "I" '((0 . "*TEXT")))) (command ".undo" "BE") (if (not SS) (progn (prompt "- Select text object") (setq SS (ssget '((0 . "*TEXT")))) );progn );if (setq OSMLAST (getvar "osmode")) (setvar "OSMODE" 0) (setq n 0) (repeat (sslength SS) (setq txt (ssname SS n)) (if (= (DXF 0 txt) "TEXT") (progn (setq PTxt (GET_MIDTEXT txt)) (setq lstpoint1 (lstpoint (UOject txt))) (setq lstpoint2 (lstpoint (AOject txt))) (setq pt (pmin lstpoint1)) (setq pp (pmax lstpoint2)) (setq PTX (CV:Geom-Midpoint pt pp)) (setq Pc (list (car PTxt) (cadr PTX) 0.0)) (vl-cmdf "move" txt "" PTxt Pc) ) (progn (TM txt) (setq PTxt (DXF 10 txt)) (setq lstpoint1 (lstpoint (UOject txt))) (setq lstpoint2 (lstpoint (AOject txt))) (setq pt (pmin lstpoint1)) (setq pp (pmax lstpoint2)) (setq PTX (CV:Geom-Midpoint pt pp)) (setq Pc (list (car PTxt) (cadr PTX) 0.0)) (entmod (subst (cons 10 Pc) (cons 10 PTxt) (entget txt))) ) ) (setq n (1+ n)) );repeat (command ".undo" "E") (princ "\n***Copyright © 2012 damvinhduy***") (setvar "osmode" OSMLAST) (princ) );end TC ;;;--------------------------------------------------------------------- (defun GET_MIDTEXT (EN / TB PTxt PT0 PTA) (setq TB (textbox (entget EN)) PTxt (CV:Geom-Midpoint (car TB) (cadr TB)) PT0 (DXF 10 EN) PTA (list (+ (car PT0) (car PTxt)) (+ (cadr PT0) (cadr PTxt)))) (polar PT0 (+ (DXF 50 EN) (angle PT0 PTA)) (distance PT0 PTA)) );end ;;;--------------------------------------------------------------------- (defun DXF (Id Obj) (cdr (assoc Id (entget Obj))) ) ;;;--------------------------------------------------------------------- (defun TM (txt / p pl hor at atnew) (setq ver (cdr (assoc 43 (entget txt)))) (setq at (cdr (assoc 71 (entget txt)))) (setq P (cdr (assoc 10 (entget txt)))) (if (and (/= at 4) (/= at 5) (/= at 6)) (progn (cond ((or (= at 1) (= at 2) (= at 3)) (setq p1 (polar p (* 1.5 pi) (* ver 0.5))) ) ((or (= at 7) (= at 8) (= at 9)) (setq p1 (polar p (* 0.5 pi) (* ver 0.5))) ) ) (cond ((or (= at 1) (= at 7)) (setq atnew 4) ) ((or (= at 2) (= at 8)) (setq atnew 5) ) ((or (= at 3) (= at 9)) (setq atnew 6) ) ) (entmod (subst (cons 10 p1) (cons 10 p) (entget txt))) (entmod (subst (cons 71 atnew) (cons 71 at) (entget txt))) (setq txt txt) ) (setq txt txt) ) ) ;;;--------------------------------------------------------------------- (defun AOject (txt / h l p0 p1 ss1 LOj) (setq h (DXF 40 txt)) (setq l (* 70 h)) (setq p0 (DXF 10 txt)) (setq p1 (polar p0 (* 0.5 pi) l)) (setq ss1 (ssget "F" (list p0 p1) (list (cons 0 "*LINE")))) (setq AOj (ssname ss1 0)) AOj ) ;;;--------------------------------------------------------------------- (defun UOject (txt / h l p0 p2 ss2 ROj) (setq h (DXF 40 txt)) (setq l (* 70 h)) (setq p0 (DXF 10 txt)) (setq p2 (polar p0 (* 1.5 pi) l)) (setq ss2 (ssget "F" (list p0 p2) (list (cons 0 "*LINE")))) (setq UOj (ssname ss2 0)) UOj ) ;;;--------------------------------------------------------------------- (defun lstpoint (eline) (cond ( (wcmatch (cdr (assoc 0 (entget eline))) "LINE") (append (list (vlax-curve-getStartPoint eline) (vlax-curve-getEndPoint eline))) ) ( (wcmatch (cdr (assoc 0 (entget eline))) "LWPOLYLINE") (getvert-en eline) ) ) ) ;;;--------------------------------------------------------------------- (defun pmin (lstpoint) (apply 'mapcar (cons 'min lstpoint)) ) ;;;--------------------------------------------------------------------- (defun pmax (lstpoint) (apply 'mapcar (cons 'max lstpoint)) ) ;;;--------------------------------------------------------------------- (defun getvert-en (en / i L) (setq i -1 L nil) (repeat (fix (1+ (vlax-curve-getEndParam en))) (setq i (1+ i) L (append L (list (vlax-curve-getPointAtParam en i)))) ) ) ;;;--------------------------------------------------------------------- (defun CV:Geom-Midpoint (p1 p2)(mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2))
-
2
-
-
Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.
Không ai có thể giúp mình câu hỏi này sao?
-
Trích dẫn:
ActiveX Server returned an error: Invalid index
Chương trình sử dụng hàm Vlax-safearray->list để chuyển 1 Safearray rỗng đến 1 List.
Chưa hiểu ý của bác. Bác có thể nói rõ nguyên nhân và cách khắc phục không. Cảm ơn nhiều.
-
Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.
-
Có cái (command "PREVIEW") mà bạn. Nếu bạn biết Lisp thì mình làm cái đó ở chỗ này
(progn (command "-PLOT" "y" "Model" tenmayin tenkhogiay "m" ngangdoc "n" "Window" pt1 pt2 "f" xyoffset "y" tenplotstyle "y" "Wireframe" "n" "y" "n" ) (command "PREVIEW") )
Mình cũng biết chút xíu lisp. Nhưng giờ mới biết hàm (Command "PREVIEW") hihi. Cứ tưởng nó nằm trong hàm "Command "PLOT" "Y") luôn chứ.
Cảm ơn bạn đã chia sẽ. Thanks.
-
Lisp này nếu in sang pdf có thể ghi tên tự động thì tuyệt. Ví dụ mình in 20 bản vẽ cùng lúc, mình chỉ cần gõ tên bản vẽ đầu tiên là 5 thì nó sẽ tự động ghi tên các bản vẽ tiếp theo là 6,7...24. Chắc là khó đây vì cái này phụ thuộc vào kiểu máy in, không biết có kiểu máy in ảo nào có thể làm được việc đó không nhỉ. Nhân tiện hỏi bác nguyentuyen một chút, mình gõ lệnh (Command "PLOT" "") sao không thấy có phần Preview trong đó nhĩ. Thanks.
-
Bạn có thể sử dụng lệnh Lentheng sau đó sử dụng biên hệ thống Perimeter để lấy chiều dài của đối tượng vừa pick
Tham khảo code
(defun c:getLen() (command "lengthen" (car(entsel "\n Pick vao doi tuong de lay chieu dai :")) "") (alert (strcat "Chieu dai cua doi tuong la :" (rtos (getvar "Perimeter") 2 3))) (princ) )
Cảm ơn các bác nhiều lắm. Nhưng cái khó khăn của em là như thế này: Em muốn chọn một tập hợp nhiều đối tượng một lúc(trong đó có thể là LINE, CIRCLE, SPLINE, RECTANG...) nhưng em muốn loại bỏ những đường LINE nào có độ dài >=50 chẳng hạn. Em không biết dùng hàm SSget đó như thế nào cả. Bác nào biết thì viết hộ em một cái. Em cảm ơn.
-
Bạn nói rõ hơn khái niệm "centered". Nếu nó là "centered" của 2 đường dóng thì bạn dùng 2 đoạn code này:
(setvar "Dimjust" 0)
(setvar "Dimtad" 0)
Còn nếu là "centered" của chính đường kích thước (tức text nằm ngay trên chính đường kích thước) thì lại khác.
Ý của em là dùng lisp thực hiện lệnh giống như lệnh DIMTEDIT của CAD(chọn thuộc tình Center). Nhưng em muốn chọn một lúc nhiều đối tượng DIMENSION và thực hiện. Lệnh DIMTEDIT chỉ chọn một đối tượng DIMENSION một lần. Thanks.
-
Chom mình hỏi có lisp nào làm cho các chữ số kích thước về vị trí trung tâm(center) của đường kích thước không nhĩ. Thanks.
-
Đây là câu hỏi vô nghĩa bạn ạ, vì Khoảng cách là phải so với đâu đó. Nếu ý bạn là chiều dài nhỏ hơn 50 thì hãy iểm tra Line, nếu nó dài hơn 50 thì loại khỏi tập chọn, sau đó sssetfirst tập còn lại
Mình không biết làm thế nào để kiểm tra độ dài của đoạn thẳng đó, nếu bạn biết thì hãy chỉ cho mình.
-
(ssget(list '(-4 . "<OR")'(-4 . "<AND")(cons 0 "LINE,LWPOLYLINE")(cons 6 "CENTER,CENTER2")'(-4 . "AND>")'(0 . "DIMENSION")'(-4 . "OR>")))
Cho mình hỏi thêm một câu: Làm thế nào để chọn được tập hợp các LINE có khoản cách nhỏ hơn 50. Thanks.
-
(ssget(list '(-4 . "<OR")'(-4 . "<AND")(cons 0 "LINE,LWPOLYLINE")(cons 6 "CENTER,CENTER2")'(-4 . "AND>")'(0 . "DIMENSION")'(-4 . "OR>")))
Cảm ơn Thaistreetz nhiều. Bạn đã hiểu nhầm ý của mình. Dạng đường Center hoặc Center2 chỉ là của LINE thôi. Mình đã viết được bằng cách dùng đoạn lisp sau:
(ssget '((-4 . "<OR")
(0 . "DIMENSION")
(0 . "LWPOLYLINE")
(-4 . "<AND")
(0 . "LINE")
(-4 . "<OR")
(6 . "CENTER")
(6 . "CENTER2")
(-4 . "OR>")
(-4 . "AND>")
(-4 . "OR>")
)
)
Thanks bạn nhiều.
-
Chào các bạn. Mình có một câu hỏi muốn nhờ các bạn. Mình muốn dùng hàm ssget để chọn các đối tượng có đặc tính như sau: đối tượng là LWPOLYLINE hoặc đối tượng LINE(có kiểu Linetype là center hoặc center2 không phải HIDDEN hoặc HIDDEN2) hoặc đối tượng là các DIMENSION. Rất mong sự giúp đỡ của các bạn. Thanks.
Không có ai giúp mình câu này à?
-
Chào các bạn. Mình có một câu hỏi muốn nhờ các bạn. Mình muốn dùng hàm ssget để chọn các đối tượng có đặc tính như sau: đối tượng là LWPOLYLINE hoặc đối tượng LINE(có kiểu Linetype là center hoặc center2 không phải HIDDEN hoặc HIDDEN2) hoặc đối tượng là các DIMENSION. Rất mong sự giúp đỡ của các bạn. Thanks.
-
Chào Doan Van Ha
Biến là do mình đặt ra. Bạn có thể viết gọn lại
Với hàm gom do Tue_NV định nghĩa ở trên.
(foreach keylst (mapcar '(lambda(x y) (append (list x) y)) '("key1" "key2" "key3");danh sach key (list '(1 5 6) '( 3 5 7) '(6 4 9)); co the dinh nghia danh sach cac bien List ) (GOM keylst) )
Chào damvinhduy
Bạn sử dụng cái này
(acet-explode (ssget '((0 . "MTEXT"))))
Chọn MTEXT -> nó sẽ explode thành TEXT và trả về các Text này trong 1 tập chọn
Cảm ơn anh Tue. Hôm nay biết thêm một hàm khác nữa.
-
Muốn tự viết cái Líp in cho mình nên Em mới viết cái Lisp này. Các bác cho em nhận xét nhé.
Công dụng: Dùng để in nhiều bản vẽ trong 1 file cad (dwg) mà chỉ phải chỉnh 1 lần.
20/4: Sửa lỗi
18/4: Sửa lỗi+ thêm phần Plot offset
16/4: Chú ý :
Mình vừa sửa 1 số lỗi trong phần PLOT to File của Líp. Bạn nào down rồi thì down lại giúp mình nhé. Nếu không khi chọn đường dẫn là nó lưu sai chỗ.
Và sửa phần SORT đối với lệnh in nhé. Nếu ko là nó ko xếp theo thứ tự đâu!!!
Lệnh TPL hoặc IN hoặc MP:
Download: TPL-IN-MP
Hướng dẫn:
1: Chọn tên máy in, khổ giấy, plotstyle cần in
2: Có 2 lựa chọn :
------Block: Khi chọn vùng in sẽ nằm trong block chọn. Để lấy block mẫu ấn vào nút Pick
------Rectangle: Khi chọn vùng in sẽ nằm trong rectangle chọn. Và chỉ chọn đc Rec có layer ở khung layer
3: Khi muốn xuất ra PDF thì chọn đường dẫn lưu File
4: Sắp xếp in:
------ Nomal: cái nào chọn trước in trước
------ Left->Right : in từ trái sang phải bất kể chọn cái nào trước
------ Top->Bottom : in từ trên xuống dưới bất kể chọn cái nào trước.
5: Chỉnh Plot Offset
Thank!!!
Lisp quá tuyệt vời bác. Thanks bác nhiều lắm. Nhờ lisp này mà mình đỡ tốn một khoản thời gian chuyển cad-> pdf. Mình cũng đã viết một lisp về in nhưng khá thủ công và không thể Multiple như của bác đựơc. Sao mình không thấy nút "Thanks" chỗ nào nhĩ. Một lần nữa xin cảm ơn nhuyentuyen
-
2
-
-
Chào các bạn. Mình có một vấn đề muốn được giúp đỡ. Trên bản vẽ của mình có rất nhiều đối tượng kiểu MTEXT ví dụ A,B,C...X,Y,Z. Bây giờ mình dùng hàm ENTSEL để chọn ra 2 đối tượng M,N bất kỳ trong số các đối tượng MTEXT trên. Sau đó dùng lệnh EXPLODE để chuyển hai đối tượng M,N về kiểu DTEXT. Bây giờ mình muốn truy xuất 2 đối tượng vừa mới phá(sau khi EXPLODE) nhưng không biết làm cách nào. Mong nhận được sự giúp đỡ của các bạn. Xin cảm ơn.
-
Rất hay. Lệnh này rất tiện khi vẽ đường tâm của đường tròn. Nếu philip phát triển thêm cho hình chữ nhật, elip hoặc khi chọn 2 điểm bất kỳ nữa thì tuyệt vời. Thanks.
-
Hixhix. Buồn thủi buồn thui. Tue_NV đã viết trả lời bạn ở trang trước (Viết Lisp theo yêu cầu phần 2- (trang 59)).Bạn chưa đọc kỹ hay sao?????
Mình đã làm tất cả những gì như Tue đã hướng dẫn nhưng kết quả:
Load vào báo sucessful nhưng khi nhập lệnh dstt thi báo Unknown command "DSTT". Press F1 for help. Trong lệnh trên nếu thay T10A030 bằng một text khác bất kỳ có thể thay đổi kiểu TABCDEF, trong đó EF là kiểu ký tự số, TABCD có thể là chữ hoặc số thì phải làm sao. Mình chỉ cần 2 con số cuối của text thay đổi thôi còn các ký tự trước đó không quan tâm là gì. Cảm ơn Tue_NV.
Và mình đã nhờ Tue ở trang trước. Rất mong được Tue giúp đở. Cảm ơn nhiều!
-
load vào báo sucessful nhưng khi nhập lệnh dstt thi báo Unknown command "DSTT". Press F1 for help. Trong lệnh trên nếu thay T10A030 bằng một text khác bất kỳ có thể thay đổi kiểu TABCDEF, trong đó EF là kiểu ký tự số, TABCD có thể là chữ hoặc số thì phải làm sao. Mình chỉ cần 2 con số cuối của text thay đổi thôi còn các ký tự trước đó không quan tâm là gì. Cảm ơn Tue_NVTue_NV không thể giúp mình với lisp này được à. Hixhix
-
Bạn thử code Lisp này nhé :(defun c:dstt(/ ss delta ob chuoi chdau chcuoi) (vl-load-com) ;; copyright by Tue_NV (setq ss (ssget "X" (list(cons 0 "*TEXT") (cons 1 "T10A030*"))) i -1) (setq delta (getint "\n so tang giam :")) (while (setq ent (ssname ss (setq i (1+ i)))) (setq ob (vlax-ename->vla-object ent)) (setq chuoi (vlax-get ob 'textstring)) (setq chdau "T10A030") (setq chcuoi (atoi (substr chuoi (1+ (strlen chdau)) (strlen chuoi)))) (if (and (>= (+ chcuoi delta) 0) (<= (+ chcuoi delta) 9)) (vlax-put ob 'textstring (strcat chdau "0" (itoa (+ chcuoi delta)))) ) (if (> (+ chcuoi delta) 9) (vlax-put ob 'textstring (strcat chdau (itoa (+ chcuoi delta)))) ) ) (princ) )
load vào báo sucessful nhưng khi nhập lệnh dstt thi báo Unknown command "DSTT". Press F1 for help. Trong lệnh trên nếu thay T10A030 bằng một text khác bất kỳ có thể thay đổi kiểu TABCDEF, trong đó EF là kiểu ký tự số, TABCD có thể là chữ hoặc số thì phải làm sao. Mình chỉ cần 2 con số cuối của text thay đổi thôi còn các ký tự trước đó không quan tâm là gì. Cảm ơn Tue_NV
-
mình thì ko biết có lisp như bạn cần ko, nhưng nếu bạn đang gấp thì có thể làm theo 3 bước như sau:Bước 1:bạn dùng LISP thêm bớt text bỏ đi các ký tự phía trước, chỉ chừa lại 2 số cuối (XY). http://www.cadviet.com/forum/index.php?showtopic=6991
Bước 2:bạn dùng LISP cộng trừ nhân chia text của bạn THAISTREETZ http://www.cadviet.com/forum/index.php?sho...3203&st=100 bài viết #105.
Bước 3:làm ngược lại bước 1 là thêm lại chuỗi text đã bỏ.
Còn tổng hợp 3 bước này lại thành 1 lisp thì nhờ các cao thủ của chúng ta ra tay!
Thân!
Cảm ơn truongthanh, nhưng mình thấy nếu có một lisp nào đó duy nhất thì hay biết mấy. Chỉ cần nhấp chuột là đối tượng tự thay đổi. Mình đang mày mò học về lisp, hy vọng sẽ làm được. Cảm ơn!
-
Mình rất cần một lisp như sau:
Mình làm thiết kế nên có rất nhiều bảng vẽ được đánh số thứ tự như sau: T10A03001, T10A03002, T10A03003...T10A030XY. Trong đó T10A030 là ký hiệu bảng vẽ (giống nhau với mọi bảng vẽ), 2 số cuối 01, 02, 03...XY là số thứ tự bảng vẽ. Bây giờ muốn bổ xung hay bỏ bớt bảng vẽ thì số thứ tự bảng vẽ cũng thay đổi theo. Nếu làm cách thủ công là chọn từng text và sửa thì quá lâu. Nên mình nhờ các bạn viết dùm mình một lisp với tác dụng:
- Nhập lệnh.
- Nhập số cần tăng hoặc giãm. Ví dụ +4 thì tương ứng số thứ tự bảng vẽ(XY) sẻ tăng thêm +4 đơn vị (T10A03005->T10A03009) hoặc -4 thì tương ứng số thứ tự bảng vẽ sẻ bớt đi 4 đơn vị (T10A03005->T10A03001). Mặc định là tăng +1 đơn vị.
- Chọn đối tượng cần thay đổi (Mtext hoặc Text), lệnh sẽ thực thi. Chọn tiếp đối tượng cần thay đổi(nếu có). Enter hoặc ESC kết thúc lệnh.
Xin cảm ơn các bạn rất nhiều.
[yêu cầu] lisp tính ngược giá trị của mắt lưới san nền ?
trong AutoLisp
Đã đăng · Trả lời báo cáo
Sao từ "anh" mà chuyển sang "bác" nhanh vậy bạn? Phải gọi bằng "anh" thì người ta mới giúp chứ :D