Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

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

Các cao thủ trong cadviet ơi viết cho mình hai lisp thực hiện công việc như này được không, đây là file thành phẩm.

http://www.cadviet.com/upfiles/2/file.dwg

Bạn là một minh chứng cụ thể nhất cho trường hợp không biết tận dụng những công cụ cad cung cấp để xử lý công việc mà phải thụ động nhờ mọi người viết lisp.

Với yêu cầu thứ nhất của bạn, mình chỉ cần sử dụng Layiso và hộp thoại Properties là mọi việc được giải quyết đơn giản. mất không quá 1 phút cho dù bản vẽ của bạn có bao nhiêu trắc ngang đi nữa.

Còn yêu cầu thứ 2 thì mình có thể giúp bạn được.

  • 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
Bạn là một minh chứng cụ thể nhất cho trường hợp không biết tận dụng những công cụ cad cung cấp để xử lý công việc mà phải thụ động nhờ mọi người viết lisp.

Với yêu cầu thứ nhất của bạn, mình chỉ cần sử dụng Layiso và hộp thoại Properties là mọi việc được giải quyết đơn giản. mất không quá 1 phút cho dù bản vẽ của bạn có bao nhiêu trắc ngang đi nữa.

Còn yêu cầu thứ 2 thì mình có thể giúp bạn được.

Uh trường hợp thứ nhất thì mình hơi lười thật, mình đang dùng cad 2002 không có layiso.

Giúp mình trường hợp thứ hai nhé.

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
Uh trường hợp thứ nhất thì mình hơi lười thật, mình đang dùng cad 2002 không có layiso.

Giúp mình trường hợp thứ hai nhé.

Mình dùng cad14 còn có express tool, không lẽ cad2002 lại không có? bạn chưa cài thôi.

code của bạn đây:

(defun c:stn()
(command "undo" "begin")
(setq oldos (getvar "osmode"))
(setq olcol (getvar "CEColor"))
(setq ollay (getvar "Clayer"))
(setq olstyle (getvar "textstyle"))
(setq ssdt (ssget (list (cons 0 "LINE,text"))))
(command "osmode" 2)
(setq pt1 (getpoint "\nPick trung diem line chan dau\n"))
(setq pt2 (getpoint "\nPick trung diem line chan cuoi\n" pt1))
(setq di (distance pt1 pt2))
(setq pt3 (polar pt1 0 (* di 0.5)) tong 0 i 0)
(repeat (sslength ssdt)
(setq txt_ent (entget (ssname ssdt i)))
(setq txt_val (cdr(assoc 1 txt_ent)))
(if txt_val (progn
(setq tong (+ tong (atof txt_val)))
(setq txt_h (cdr(assoc 40 txt_ent)))
(setq txt_st (cdr(assoc 7 txt_ent)))
(setq txt_lay (cdr(assoc 8 txt_ent)))
(setq txt_clr (cdr(assoc 62 txt_ent))))
);if
(setq i (+ i 1))
);repeat
(command "erase" ssdt "")
(command "clayer" txt_lay "textstyle" txt_st "color" txt_clr "osmode" 0)
(command "text" "mc" pt3 txt_h 0 (rtos tong 2 2))
(setvar "textstyle" olstyle)
(setvar "Clayer" ollay)
(setvar "CECOLOR" olcol)
(setvar "osmode" oldos)
(prompt"\n[EDIT TRAC NGANG] by Thaistreetz - huuthais@yahoo.com\n")
(command "undo" "end")
);defun

- chọn các đối tượng gồm text và các line cần xoá.

- Pick trung điểm 2 đường line chắn 2 đầu -> OK

Ngoài lề 1 chút: về bảng trắc ngang của bạn. Thông thường người ta để cao độ và khoảng cách lẻ thiết kế bên trên, cao độ tự nhiên và khoảng cách lẻ tự nhiên bên dưới. Bạn nên sửa lại bảng trắc ngang nova, mặc định nova nó sắp xếp bị ngược.

  • 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

chao!

có cao thủ nào co thể giúp mình viết 1 lisp đếm số block được không.

Thanhk you!

Nếu có thể gửi qua mail: thanhlam89@gmail.com

mình cảm ơn nhiều vì mình không thường xuyên lên mạng được.

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
chao!

có cao thủ nào co thể giúp mình viết 1 lisp đếm số block được không.

Thanhk you!

Nếu có thể gửi qua mail: thanhlam89@gmail.com

mình cảm ơn nhiều vì mình không thường xuyên lên mạng được.

 

Bạn thử dùng lệnh FI có sẵn của AutoCad nhé.

  • 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
chao!

có cao thủ nào co thể giúp mình viết 1 lisp đếm số block được không.

Thanhk you!

Nếu có thể gửi qua mail: thanhlam89@gmail.com

mình cảm ơn nhiều vì mình không thường xuyên lên mạng được.

Hihi bạn select những Block đó xoá đi bật F2 biết ngay bao nhiêu đối tượng xoá rồi undo lại là được mà

  • 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
Ngoài lề 1 chút: về bảng trắc ngang của bạn. Thông thường người ta để cao độ và khoảng cách lẻ thiết kế bên trên, cao độ tự nhiên và khoảng cách lẻ tự nhiên bên dưới. Bạn nên sửa lại bảng trắc ngang nova, mặc định nova nó sắp xếp bị ngược.

Mình đã tìm cài Express của cad2002 nhưng không có hình như cad2002 không có Express hay sao ấy mà đúng là cad14 lại có.

Cám ơn bạn nhé lisp đã giúp tớ rất nhiều trong công việc, nó làm cho trắc ngang đỡ rối trông đẹp hơn. Thông thường người ta để cao độ và khoảng cách lẻ thiết kế bên trên để dễ cho việc kiểm tra công việc thiết kế nhìn thuận mắt hơ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ó cao thủ nào giúp mình viết 1 lisp đếm số block được chọn, mục đích để đếm số block được nhanh hơn. thank you!

Topic này hằng ngày không chỉ có một mình bạn vào, vì thế không fải mọi người không ai thấy việc bạn đang nhờ. vì vấn đề của bạn nêu nó đã được mọi người nói đi nói lại đến nhàm chán. bạn đừng post nhiều bài cùng một nội dung như vậy nữa mà hãy chịu khó tìm kiếm, thế cũng hơn là ngồi chờ đợi.

bạn dùng properties mà đếm block hay bất kỳ nhóm đối tượng nào. việc này đơn giản vậy sao fải dùng lisp?

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
Mình đã tìm cài Express của cad2002 nhưng không có hình như cad2002 không có Express hay sao ấy mà đúng là cad14 lại có.

Bạn hãy tìm Express của cad2000 copy vào cad2002 sau đó copy thêm file acettest.fas vào thư mục support là đc

  • 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
Lạ thiệt??? Tại sao cứ phải là Lisp mới được àh? Vậy thành ra không có Lisp thì AutoCAD không làm được àh?

 

Bạn nào cho mình bài toán làm 1 việc gì đó mà AutoCAD không làm được đi??? :cheers:

Đây bạn :

Cho Text1 là số : 1

Cho Text2 là số : 2

 

Cho Text3 là 1 chữ bất kì

 

-> Bạn Trang Dùng CAD bấm chọn Text1; Text2 -> Sau đó Pick chọn Text3 -> Sẽ là số 3 được không? (1+2)=3

 

Nếu mình dùng CAD thì như sau : Nhìn vào Text1 thấy số 1 , Nhìn vào Text2 thấy số 2. Rút cái máy tính bấm tay ra :bấm 1+ 2 = 3 . Dùng ddedit -> chọn Text3 bấm số 3. Đơn giản mà dùng CAD như vậy đó.

Đơn giản chỉ là 2 Text , nếu mà là nhiều Text thì so le con mắt mất thui :cheers:

 

Bạn Trang có cách nào dùng CAD bấm chọn Text 1, Text2 -> Sau đó pick chọn Text 3 sẽ là Tổng số của Text1 và Text2 không nhỉ? Bạn nói ra bài toán thì mình ra rồi. Mình đang chờ câu trả lời của bạn

 

Mình thấy 2 câu nói này của bạn có vẻ không hợp nhau nhỉ?

AutoCAD hỗ trợ rất nhiều. Nếu bạn nắm vững hết AutoCAD thì bạn có thể làm được mọi thứ mà không cần đến AutoLisp.
Hài lòng với CAD cung cấp ư? Không bao giờ. Vì khi bạn làm sẽ có phát sinh. Nhưng với hiện tại thì với những gì AutoCAD cung cấp, bạn có thể gần như làm được mọi thứ.

Một cái thì bạn có thể làm được mọi thứ

Một câu thì gần như làm được mọi thứ.

Tue_NV không thích câu trả lời hàng hai như thế này. Bạn làm ơn giải thích hộ

 

Bài toán của bạn thanhlam03xt có thể giải quyết bằng CAD và cũng có Lisp viết rồi. Bạn chịu khó tìm kiếm nhé

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

May quá anh Tuệ online sớm.

Anh giải đáp cho em cái này với.

Em có một tập hợp text được chọn bằng SSGET. sau đó em dùng vl-sort để sắp xếp lại các đối tượng text trong tập hợp đó theo tọa độ X và Y của mỗi text tăng dần. Cái này em đã giải quyết xong.

Bây giờ em muốn dùng vòng lặp While để gán lần lượt các giá trị khác vào tập hợp text đó. nhưng em đang mắc ở đoạn tô đậm này. Anh ra tay giúp em đoạn này với. hic! em đánh vật với nó cả đêm, mụ mẫm hết cả đầu rồi :cheers:

 

Anh có thể hiểu yêu cầu của em bằng một bài toán đơn giản như sau:

Chọn 1 tập hợp text trên bản vẽ và đánh số thứ tự vào các text đó theo thứ tự ưu tiên, text nào có tọa độ X nhỏ đánh trước, nếu X bằng nhau thì text nào có Y nhỏ đánh trước.

 

Edit: Hiện giờ em đang giải quyết nó bằng cách lấy tọa độ của mỗi text, xóa nó đi rồi ghi một text mới thay vào đúng tọa độ đó với giá trị mong muốn. nhưng cách này quả thực củ chuối quá, đồng thời có vài hạn chế khiến em ko hài lòng lắm.

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
May quá anh Tuệ online sớm.

Anh giải đáp cho em cái này với.

Em có một tập hợp text được chọn bằng SSGET. sau đó em dùng vl-sort để sắp xếp lại các đối tượng text trong tập hợp đó theo tọa độ X và Y của mỗi text tăng dần. Cái này em đã giải quyết xong.

Bây giờ em muốn dùng vòng lặp While để gán lần lượt các giá trị khác vào tập hợp text đó. nhưng em đang mắc ở đoạn tô đậm này. Anh ra tay giúp em đoạn này với. hic! em đánh vật với nó cả đêm, mụ mẫm hết cả đầu rồi :cheers:

 

Anh có thể hiểu yêu cầu của em bằng một bài toán đơn giản như sau:

Chọn 1 tập hợp text trên bản vẽ và đánh số thứ tự vào các text đó theo thứ tự ưu tiên, text nào có tọa độ X nhỏ đánh trước, nếu X bằng nhau thì text nào có Y nhỏ đánh trước.

 

Edit: Hiện giờ em đang giải quyết nó bằng cách lấy tọa độ của mỗi text, xóa nó đi rồi ghi một text mới thay vào đúng tọa độ đó với giá trị mong muốn. nhưng cách này quả thực củ chuối quá, đồng thời có vài hạn chế khiến em ko hài lòng lắm.

Chào bác ThaiStreetz,Mìnhchưa hiểu ý bác lắm.

a/- việc đánh số thứ tự các text theo một trật tự nhất định thì trên diễn đàn đã có lisp rồi.

b/- việc thay thế các text cũ với các già trị text mới thì bác cần nói rõ là bác thay toàn bộ các text cũ bằng một text mới hay thay có chọn lọc, tức là mỗi text cũ sẽ tùy theo giá trị của nó sẽ được thay hoặc không thay bằng một text mới với giá trị do người sử dụng nhập vô.

Bác thử tham khảo đoạn lisp này, dùng để thay thế hoặc không thay thế một text cũ bằng một text mới với giá trị do người dùng nhập vào:

(defun c: changetext ()

(setq t1(entsel "\n Hay chọn text ")

lst (entget (car t1))

txt (cdr (assoc 1 lst))

)

(princ txt)

(setq ans (getstring "\n Ban muon thay gia tri text : [y hay n]: "))

(if (= ans "y")

(progn

(setq new (getstring "\n Nhap gia tri thay the: ")

lst (subst (cons 1 new) (assoc 1 lst) lst)

)

(entmod t1)

)

)

)

 

Việc đưa đoạn lisp này vào trong vòng lặp While chắc bác đã quá rành. Mình hy vọng bác có thể sử dụng đoạn lisp này để chỉnh sửa theo ý bác ngon lành.

Chúc bác thành công.

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ó anh nào có lisp tính tổng diện tích như thế này không ?

Tính diện tích các hình bao kín bằng cách pick vào phía trong hình kín đó (giống như hach ấy). Sau khi pick vào hình --> chọn đối tượng là text--> gán giá trị diện tích vừa tính được vào text đó. (nếu pick nhiều hình, nhiều lần thì giá trị gán vào text sẽ tà tổng diện tích của các hình đó).

Trước khi pick vào hình thì lisp yêu cầu nhập tỉ lệ bản vẽ.

Anh nào có giúp em với !

Em đang cần tính diện tích của nhiều hình ( cùng tỉ lệ bản vẽ) nhưng phải tính diện tích của từng hình, sau đó cộng lại, có vẽ thủ công quá !

Nếu có thể thì nhắn giúp em qua mail : lquocthinh@gmail.com

Thank you các anh chị rất nhiều. :cheers:

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ó anh nào có lisp tính tổng diện tích như thế này không ?

Tính diện tích các hình bao kín bằng cách pick vào phía trong hình kín đó (giống như hach ấy). Sau khi pick vào hình --> chọn đối tượng là text--> gán giá trị diện tích vừa tính được vào text đó. (nếu pick nhiều hình, nhiều lần thì giá trị gán vào text sẽ tà tổng diện tích của các hình đó).

Trước khi pick vào hình thì lisp yêu cầu nhập tỉ lệ bản vẽ.

Anh nào có giúp em với !

Em đang cần tính diện tích của nhiều hình ( cùng tỉ lệ bản vẽ) nhưng phải tính diện tích của từng hình, sau đó cộng lại, có vẽ thủ công quá !

Nếu có thể thì nhắn giúp em qua mail : lquocthinh@gmail.com

Thank you các anh chị rất nhiều. :cheers:

Vấn đề của bạn đã được bàn tới nhiều rồi, sử dụng chức năng tìm kiếm sẽ thấy

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ạ thiệt??? Tại sao cứ phải là Lisp mới được àh? Vậy thành ra không có Lisp thì AutoCAD không làm được àh?

 

Bạn nào cho mình bài toán làm 1 việc gì đó mà AutoCAD không làm được đi??? :cheers:

Giúp tôi với:

1. Hãy tìm một điểm trong 1 đa giác bất kỳ, mà tại điểm này tôi có thể vẽ 1 vòng tròn có bán kính lớn nhất và vòng tròn này chỉ tiếp xúc trong với đa giác mà không cắt đa giác đó.

2. Có 1 đường cong trơn Spline. Hãy tìm n+1 điểm sao cho các điểm này chia đường cong này n đoạn có kích thước dài theo đường cong bằng nhau (không phải đường chim bay), và hãy giúp tôi vẽ 1 đa giác có n+1 cạnh đi qua n+1 điểm này sao cho n+1 cạnh tiếp xúc với đường cong :cheers:.

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 có lisp như sau:

 

(defun C:TLA (/ Text_app)

(setvar "Cmdecho" 0)

(setq Text_app(ssget "X" '((0 . "*Text")) ))

(if Text_app

     (progn

       (M_lay_c "pointname" "3");Tao Layer pointname neu chua co

       (command "_.Chprop" Text_app "" "LA" "pointname" "C" "Bylayer" "")

     )

     (prompt "\nHien tai, khong co Texts.")

)

(princ)

)

 

(defun C:PLA (/ Point_app)

(setvar "Cmdecho" 0)

(setq Point_app(ssget "X" '((0 . "*point")) ))

(if Point_app

     (progn

       (M_lay_c "point" "7");Tao Layer point neu chua co

       (command "_.Chprop" Point_app "" "LA" "point" "C" "Bylayer" "")

     )

     (prompt "\nHien tai, khong co points.")

)

(princ)

)

 

tôi muốn kết hợp 2 lisp trên thành 1 lisp để công việc nhanh hơn,xin được giúp đở..cám ơn.. :cheers:

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 bác ThaiStreetz,Mìnhchưa hiểu ý bác lắm.

Chào anh Thanh Bình :cheers:

Đúng là anh chưa hiểu ý em thật. bài toán đánh số thứ tự của em như trên chỉ là để diễn đạt ý muốn của em thôi anh. anh có thể hiểu như thế này:

- Em có một tập hợp text, em muốn đánh số thứ tự vào các text đó

- nhưng em lười, ko muốn pick từng text một mà chỉ cần quét chuột qua tập hợp text bằng ssget một nhát là xong luôn

- Lisp sẽ đánh số thứ tự tăng dần vào các text theo quy luật: text có tọa độ X nhỏ hơn thì đánh trước, nếu trường hợp có 2 hay nhiều text có cùng tọa độ X thì tọa độ Y sẽ được xét đến, text có tọa độ Y lớn hơn sẽ đc đánh trước.

 

Đây là đoạn code của em, anh chạy thử với 1 tập hợp text sẽ hiểu được ý em ngay thôi.

(defun ss2ent (ss / sodt index lstent)

(setq sodt (if ss (sslength ss) 0)

index 0)

(repeat sodt

(setq txt_ent (ssname ss index)

index (1+ index)

lstent (cons txt_ent lstent)

);setq

);repeat

(reverse lstent)

)

(defun c:tt()

(setq oldos (getvar "osmode"))

(setq ss (ssget '((0 . "*TEXT")))

n (sslength ss)

lst (ss2ent ss)

lst (vl-sort lst '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))))

lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))

);setq

(command "undo" "begin")

(setq i 0)

(while (< i n)

(setq txt_ent (entget (nth i lst)))

(setq pti (cdr(assoc 10 txt_ent)))

(command "text" pti 1 0 (1+ i))

(setq i (1+ i))

);while

(command "undo" "end")

(Princ)

)

trong đó đoạn in đẩm là đoạn bỏ đi và cần xử lý để ghi giá trị (i+1) trực tiếp vào text. (đoạn này chính là đoạn em đang mắc) :cheers:

 

Đây chỉ là một ví dụ của em cho dễ hiểu, thực tế em cần sử dụng cho nhiều mục đích khác anh ạ.

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ạ thiệt??? Tại sao cứ phải là Lisp mới được àh? Vậy thành ra không có Lisp thì AutoCAD không làm được àh?

 

Bạn nào cho mình bài toán làm 1 việc gì đó mà AutoCAD không làm được đi??? :cheers:

Chính bạn mới lạ. Nếu cad làm đc tất cả mọi việc thì cad bày ra lisp, ARX ... để làm gì

Ngay bản thân cad đời sau làm những cái đời trước còn thiếu hoặc chưa hoàn chỉnh, chính những cái mới này đc phát triển từ lisp, ARX ... Nói như bạn thì kg cần nâng cấp gì hết

  • 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
tôi có lisp như sau:

(defun C:TLA (/ Text_app)

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

)

(defun C:PLA (/ Point_app)

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

)

tôi muốn kết hợp 2 lisp trên thành 1 lisp để công việc nhanh hơn,xin được giúp đở..cám ơn.. :cheers:

Chào kamezoko, Lisp này, Thiep đã gộp lại:

(defun C:PTLA (/ Text_app Point_app enlay obj n lay)
 (setq	ActDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
*layer*	(vla-get-Layers ActDoc)
 )
 (vla-StartUndoMark ActDoc)
 (setvar "Cmdecho" 0)
 (setvar "osmode" 0)
 (if (not (setq enlay (tblobjname "layer" "pointname")))
   (setq lay (vla-add *layer* "pointname"))
   (setq lay (vlax-ename->vla-object enlay))
 )
 (vla-put-color lay acGreen)
 (if (not (setq enlay (tblobjname "layer" "point")))
   (setq lay (vla-add *layer* "point"))
   (setq lay (vlax-ename->vla-object enlay))
 )
 (vla-put-color lay acwhite)
 (if (setq Text_app (ssget "X" '((0 . "*Text"))))
   (progn
     (setq n 0)
     (repeat (sslength Text_app)
(setq obj (vlax-ename->vla-object (ssname Text_app n)))
(vla-put-layer obj "pointname")
(vla-put-color obj acbylayer)
(setq n (1+ n))
     )
   )
   (prompt "\nHien tai, ban ve khong co Texts.")
 )
 (if (setq Point_app (ssget "X" '((0 . "*point"))))
   (progn
     (setq n 0)
     (repeat (sslength Point_app)
(setq obj (vlax-ename->vla-object (ssname Point_app n)))
(vla-put-layer obj "point")
(vla-put-color obj acbylayer)
(setq n (1+ n))
     )
   )
   (prompt "\nHien tai, ban ve khong co points.")
 )
 (vla-EndUndoMark ActDoc)
 (princ "\nChuc cac ban thanh cong!")
 (princ)
)

Chúc bạn thàng công!

  • 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 kamezoko, Lisp này, Thiep đã gộp lại:

(defun C:PTLA (/ Text_app Point_app enlay obj n lay)
 (setq	ActDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
*layer*	(vla-get-Layers ActDoc)
 )
 (vla-StartUndoMark ActDoc)
 (setvar "Cmdecho" 0)
 (setvar "osmode" 0)
 (if (not (setq enlay (tblobjname "layer" "pointname")))
   (setq lay (vla-add *layer* "pointname"))
   (setq lay (vlax-ename->vla-object enlay))
 )
 (vla-put-color lay acGreen)
 (if (not (setq enlay (tblobjname "layer" "point")))
   (setq lay (vla-add *layer* "point"))
   (setq lay (vlax-ename->vla-object enlay))
 )
 (vla-put-color lay acwhite)
 (if (setq Text_app (ssget "X" '((0 . "*Text"))))
   (progn
     (setq n 0)
     (repeat (sslength Text_app)
(setq obj (vlax-ename->vla-object (ssname Text_app n)))
(vla-put-layer obj "pointname")
(vla-put-color obj acbylayer)
(setq n (1+ n))
     )
   )
   (prompt "\nHien tai, ban ve khong co Texts.")
 )
 (if (setq Point_app (ssget "X" '((0 . "*point"))))
   (progn
     (setq n 0)
     (repeat (sslength Point_app)
(setq obj (vlax-ename->vla-object (ssname Point_app n)))
(vla-put-layer obj "point")
(vla-put-color obj acbylayer)
(setq n (1+ n))
     )
   )
   (prompt "\nHien tai, ban ve khong co points.")
 )
 (vla-EndUndoMark ActDoc)
 (princ "\nChuc cac ban thanh cong!")
 (princ)
)

Chúc bạn thàng công!

cám ơn Thiep rất nhiều... :cheers: :cheers:

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
.....

bài toán đánh số thứ tự của em như trên chỉ là để diễn đạt ý muốn của em thôi anh. anh có thể hiểu như thế này:

- Em có một tập hợp text, em muốn đánh số thứ tự vào các text đó

- nhưng em lười, ko muốn pick từng text một mà chỉ cần quét chuột qua tập hợp text bằng ssget một nhát là xong luôn

- Lisp sẽ đánh số thứ tự tăng dần vào các text theo quy luật: text có tọa độ X nhỏ hơn thì đánh trước, nếu trường hợp có 2 hay nhiều text có cùng tọa độ X thì tọa độ Y sẽ được xét đến, text có tọa độ Y lớn hơn sẽ đc đánh trước.

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

Bạn tham khảo Lisp này.

(defun c:sort (/ cmd ss lst data i)

 (defun dxf (tag obj) (cdr (assoc tag obj)))

 (setq cmd (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (princ "\nChon cac Text can sap xep : ")
 (if (setq ss (ssget (list (cons 0 "TEXT") )))
   (progn
     (setq lst (vl-sort (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
		 '(lambda (x y) (if (equal (car(setq x1 (dxf 10 x))) (car(setq y1 (dxf 10 y))))
				      (> (cadr x1) (cadr y1))
				      (< (car x1) (car y1))
				      ))))
     (setq i 1)
     (foreach pt lst
(setq data (subst (cons 1 (itoa i)) (assoc 1 pt) pt)
      i (1+ i))
(entmod data)
)
     )
   )
 (setvar "cmdecho" cmd)
 (princ)
 )

  • 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
Chào anh Thanh Bình :cheers:

Đúng là anh chưa hiểu ý em thật. bài toán đánh số thứ tự của em như trên chỉ là để diễn đạt ý muốn của em thôi anh. anh có thể hiểu như thế này:

- Em có một tập hợp text, em muốn đánh số thứ tự vào các text đó

- nhưng em lười, ko muốn pick từng text một mà chỉ cần quét chuột qua tập hợp text bằng ssget một nhát là xong luôn

- Lisp sẽ đánh số thứ tự tăng dần vào các text theo quy luật: text có tọa độ X nhỏ hơn thì đánh trước, nếu trường hợp có 2 hay nhiều text có cùng tọa độ X thì tọa độ Y sẽ được xét đến, text có tọa độ Y lớn hơn sẽ đc đánh trước.

 

Đây là đoạn code của em, anh chạy thử với 1 tập hợp text sẽ hiểu được ý em ngay thôi.

 

trong đó đoạn in đẩm là đoạn bỏ đi và cần xử lý để ghi giá trị (i+1) trực tiếp vào text. (đoạn này chính là đoạn em đang mắc) :cheers:

 

Đây chỉ là một ví dụ của em cho dễ hiểu, thực tế em cần sử dụng cho nhiều mục đích khác anh ạ.

Chào bác ThaiStreetz,

Bác thử dùng cái này thay vào cái vòng lặp While của bác xem có đúng ý bác không nhé.

(while ((setq txt_ent (entget (nth i lst)))
	txt_con (cdr (assoc 1 tex_ent))
	txt_new (strcat (itoa (1+ i)) txt_con)
	txt_ent (subst (cons 1 txt_new) (assoc 1 txt_ent) txt_ent)
); setq
(entmod (nth i lst))
(setq i (1+ i))
); While

  • 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×