Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Em có mấy thắc mắc sau:

1. Có phương pháp nào giống như lệnh Boundary trong lisp không ạ?

2. Vì chưa tìm được cách nào nên em dùng (command "-boundary" ...), trong lisp để tạo ra các region bằng cách pick một điểm nào đó.

Vấn đề là ở chỗ này: Giả sử em có:

cd.jpg

 

Sau khi dùng Boundary em sẽ có 3 regions mới được tạo (nằm đè lên 3 đối tượng cũ). Em muốn bắt được các regions vừa được tạo và quản lý chúng, chẳng hạn như áp dụng các lệnh subtract, union, và xóa chúng đi sau khi xong việc, nhưng chưa nghĩ ra cách!

 

Mong mọi người cho ý kiế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ách này không chỉ đối với lệnh Boundary, mà áp dụng với mọi thao tác :

- Trước khi thực hiện thao tác, lấy entlast (1)

- Sau khi vưà thực hiện xong thao tác : Dùng vòng lặp duyệt entnext cho đến khi entnext = nil , gom chúng vào 1 list

=> Tạo được list các ename từ điểm đánh dấu 1

(setq Elast (entlast) (1)

...;Các thao tác khác

...

(while (setq Elast (entnext Elast )) (setq lstEname(cons Elast lstEname))) ;lstEname là list các đối tượng tạo ra sau điểm (1)

Chú ý điều kiện để có entlast (tức là trong bản vẽ đã có đối tượng rồi)

Hoặc tham khảo 2 hàm này trong bộ CV-utility ^^

(defun Collect(e / ent2 SS1 SS2)
;;;Selection set from e to entlast
(setq SS1 (ssadd))
(ssadd e SS1)
(while (setq ent2 (entnext e)) 
(ssadd ent2 SS1)
(setq e ent2)
)
(setq SS2 SS1)
)
;;;-------------------------------------------------------------------------------
(defun Collect1(e / ss)
;;;Selection set after e to entlast. If e nil, select all from fist entity of drawing.
(if (= e nil) (setq ss (collect (entnext)))
(progn (setq ss (collect e)) (ssdel e ss))
)
)

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

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

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

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.

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.

  • 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

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.

- Nếu bạn dùng thuần lisp thì bạn lấy mã dxf 10 và dxf 11 của đường thẳng đó , tương ứng với tọa độ điểm đầu và điểm cuối của đoạn thẳng, từ đó tính ra được chiều dài của nó.

- Nếu bạn dùng Vlisp thì truy xuất thông tin Length của nó.

Nếu gặp khó khăn gì thì bạn post tiếp 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

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.

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

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

Hề hề hề,

Bạn có thể sử dụng cái củ lisp này :

 
(defun c:getLength(/ en len)
(setq len (vlax-curve-getdistatpoint (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getendpoint en)))
(princ (strcat "\n" (rtos len 2 2)))
(princ)
)

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

Hề hề hề,

Bạn có thể sử dụng cái củ lisp này :

 
(defun c:getLength(/ en len)
(setq len (vlax-curve-getdistatpoint (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getendpoint en)))
(princ (strcat "\n" (rtos len 2 2)))
(princ)
)

Cái Lisp ni, bác Bình viết chỉ đúng với LINE, POLYLINE hở, còn các POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE thì kết quả không đúng nữa. Len = 0.0 mất.

Lý do : Các đường POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE có điểm cuối trùng với điểm đầu nên nếu bác Bình lấy endpoint thì Lisp cũng sẽ lấy Startpoint để tính. Và vì endpoint trùng Startpoint => Len = 0.0

Cái Lisp ni, Tue_NV nghĩ bác Bình sẽ sửa được

Chúc bác luôn khỏe

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ái Lisp ni, bác Bình viết chỉ đúng với LINE, POLYLINE hở, còn các POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE thì kết quả không đúng nữa. Len = 0.0 mất.

Lý do : Các đường POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE có điểm cuối trùng với điểm đầu nên nếu bác Bình lấy endpoint thì Lisp cũng sẽ lấy Startpoint để tính. Và vì endpoint trùng Startpoint => Len = 0.0

Cái Lisp ni, Tue_NV nghĩ bác Bình sẽ sửa được

Chúc bác luôn khỏe

Chào bác Tue_VN!

Cái này dùng

(vla-get-length(vlax-ename->vla-object(car(entsel))))
Chắc là ổn chứ Bác?

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

Đỏ: Cái này hình như Bác viết sai

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

Cái này dùng Chắc là ổn chứ Bác?

(vla-get-length(vlax-ename->vla-object(car(entsel))))

......

vla-get-length chỉ dùng đuợc cho LINE và PLINE ?

 

+ với arc phải dùng vla-get-ArcLength

+ với đuờng tròn dùng vla-get-Circumference

+ ellip, SpLine : pótay.

 

tổng quát :

- (vlax-curve-getDistAtParam (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getEndParam en))

  • 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

Cho mình hỏi về đoạn code này :

;;;;;;;;;;;Them tien to vao truoc ten cua tat ca cac Layer/Textstyle/Dimstyle tren ban ve
(defun c:ttt (/ Prefix)
(vl-load-com)
(while (or (initget "Layers Textstyles Dimstyles Exit")
					 (/= "Exit" (setq typ (cond ((getkword (strcat "\n Nhap kieu muon them tien to vao ten doi tuong Layers/Textstyles/Dimstyles/Exit <"
																												 (setq typ (cond (typ) ("Layers"))) "> :"
																							   )
																			 ))
																			(typ)
																)
											)
					 )
			 )																													 
		(setq	         Prefix (getstring (strcat "\n Nhap tien to can them vao ten cac " typ " :"))
			     activedocument (vla-get-activedocument (vlax-get-acad-object))
					    ObjectTable (cond ((= "Layers" typ) (vla-get-layers activedocument))
																((= "Textstyles" typ) (vla-get-textstyles activedocument))
																((= "Dimstyles" typ) (vla-get-dimstyles activedocument))
													)
		)
		(vlax-map-collection ObjectTable 'Add_Prefix)
 )
(princ "\n Done ")
(princ)
)
(defun Add_Prefix (Object) 
 (setq name (vla-get-name Object))
	(if (not (member (strcase name t) '("0"  "defpoints" "standard")))
	(vla-put-name Object (strcat Prefix "." name))
	)
)

Nó không làm việc với textstyles. Nguyên nhân có thể là do một số text style thuộc tính name là Real Only. Vậy làm sao để đổi được tên các style này, hoặc nếu ko đổi đc thì bỏ qua ko thực hiện với các style nà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

Nhìn code loòng thoòng quá, hay là bạn tận dụng -rename đi cho ngắn gọn dễ hiể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

Cho mình hỏi về đoạn code này :

..........

Nó không làm việc với textstyles. Nguyên nhân có thể là do một số text style thuộc tính name là Real Only. Vậy làm sao để đổi được tên các style này, hoặc nếu ko đổi đc thì bỏ qua ko thực hiện với các style này ?

Nguyên nhân thì bạn biết rồi (do một số text style thuộc tính name là Real Only).

 

Cách thực hiện thì Ketxu cũng đã có đề nghị.

Nhìn code loòng thoòng quá, hay là bạn tận dụng -rename đi cho ngắn gọn dễ hiểu ^^

Do bạn hỏi nên tôi nghĩ là bạn tự code đuợ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

Okie, dùng command rename thì mình biết rồi, ý mình muốn hỏi là có cak nào khắc phục theo phương pháp này ko thôi.

Nếu thêm điều kiện :

(if(vlax-property-available-p Object "name" T)

(progn ...........)

)

thì tất cả các text style đều ko đổi đc tên, dumpt 1 style bất kỳ thì thấy :

1_$ (vlax-dump-object Object t)
; IAcadTextStyle: A named, saved collection of settings that determines the appearance of text characters
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00eeb450>
;   BigFontFile = ""
;   Document (RO) = #<VLA-OBJECT IAcadDocument 09513b94>
;   fontFile = "Romans"
;   Handle (RO) = "3CB"
;   HasExtensionDictionary (RO) = 0
;   Height = 0.002
;   LastHeight = 0.002
;   Name (RO) = "m-2Arial-t"                              <<=========            
;   ObjectID (RO) = 2129351896
;   ObjectName (RO) = "AcDbTextStyleTableRecord"
;   ObliqueAngle = 0.0
;   OwnerID (RO) = 2129345560
;   TextGenerationFlag = 0
;   Width = 1.0
; Methods supported:
;   Delete ()
;   GetExtensionDictionary ()
;   GetFont (5)
;   GetXData (3)
;   SetFont (5)
;   SetXData (2)
T

Vậy ko đổi đc tên của text style bằng (vla-put-name ...) ?

P.s : code diễn đàn không tiện lợi lắm, mình gõ tiếng việt nhiều khi nhảy lung tung.

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âu hỏi này post vào đây sẽ là không đúng chỗ. nhưng vì muốn ai đó có trách nhiệm với box autolisp này dễ dàng đọc được nó nên mình quyết định post.

Câu hỏi là: Có chuyện gì với box autolisp này vậy? sao tự nhiên hôm nay mình thấy các topic được dính stick "đáng xem" một cách vô tội vạ thế nhỉ? mất nguyên cả trang đầu và 1/2 trang thứ 2 gồm toàn các topic kiểu "đáng xem" mà nói thực là nhiều trong số đó chẳng đáng xem chút nào.

  • 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âu hỏi này post vào đây sẽ là không đúng chỗ. nhưng vì muốn ai đó có trách nhiệm với box autolisp này dễ dàng đọc được nó nên mình quyết định post.

Câu hỏi là: Có chuyện gì với box autolisp này vậy? sao tự nhiên hôm nay mình thấy các topic được dính stick "đáng xem" một cách vô tội vạ thế nhỉ? mất nguyên cả trang đầu và 1/2 trang thứ 2 gồm toàn các topic kiểu "đáng xem" mà nói thực là nhiều trong số đó chẳng đáng xem chút nào.

Thống nhất với ý kiến của bác Thaistreetz. Định hỏi từ tối qua nhưng cứ ngỡ chắc bị virut nên chờ đến sáng nay, hóa ra vẫn thế. Có thay đổi thì cũng nên cho bàn dân thiên hạ biết với chứ. Với lại, kiểu bố trí mới này... sao sao ấ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

câu hỏi này post vào đây sẽ là không đúng chỗ. nhưng vì muốn ai đó có trách nhiệm với box autolisp này dễ dàng đọc được nó nên mình quyết định post.

Câu hỏi là: Có chuyện gì với box autolisp này vậy? sao tự nhiên hôm nay mình thấy các topic được dính stick "đáng xem" một cách vô tội vạ thế nhỉ? mất nguyên cả trang đầu và 1/2 trang thứ 2 gồm toàn các topic kiểu "đáng xem" mà nói thực là nhiều trong số đó chẳng đáng xem chút nào.

 

Tí e ngồi bỏ bớt Stick đi, chắc bác Mod nào đọc thấy hay quá Stick lên đó mà :)

Với lại "đáng xem" hay không cũng tùy người mà bác ^^

 

P/S : đã bỏ bớt stick (mặc dù hơi tiếc mấy topic hay bị chìm xuống ^^)

 

Thống nhất với ý kiến của bác Thaistreetz. Định hỏi từ tối qua nhưng cứ ngỡ chắc bị virut nên chờ đến sáng nay, hóa ra vẫn thế. Có thay đổi thì cũng nên cho bàn dân thiên hạ biết với chứ. Với lại, kiểu bố trí mới này... sao sao ấy.

:) có những thay đổi k báo cáo hết với mọi người được ^^

 

 

@codered8x : Với command thì Style nào cũng đổi được. Còn nếu bạn dump với bất kỳ style nào cũng nhận được thuộc tính Name (RO) (?), cũng có thể nói k dùng vla-put-name với TextStyle

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 thử đệ quy xem sao :

(defun Remove_dup ( lst )(if lst (cons (car lst) (Remove_dup (vl-remove (car lst) (cdr lst))))))

Chào các bạn. Đoạn Code trên ngắn gọn và rất hữu ích. Nếu có thể rất mong các bạn giúp mình giải thích cốt và quá trình hoạt động của Code được không!

Chân thành cảm ơn cộng đồng Cadviet !!!

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

forum cho em hỏi làm thế nào để láy thông tin của 1 dimstyle hoặc textstyle.

Thông tin ở đây chính là các thông số chiều cao texxt, font của text, kích thước mũi tên ...

dimstyle1.png

dimstyle2.png

Cảm ơn các anh chị em.

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

forum cho em hỏi làm thế nào để láy thông tin của 1 dimstyle hoặc textstyle.

Thông tin ở đây chính là các thông số chiều cao texxt, font của text, kích thước mũi tên ...

Cảm ơn các anh chị em.

Bạn dùng lệnh "SETVAR" để biết được các thông tin của bản vẽ hiện hành.

Còn để lấy thông tin thì bạn dùng hàm "GETVAR". Ví dụ để lấy style của dimension:

(setq txt (getvar "dimstyle"))

v.v...

  • 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

forum cho em hỏi làm thế nào để láy thông tin của 1 dimstyle hoặc textstyle.

Thông tin ở đây chính là các thông số chiều cao texxt, font của text, kích thước mũi tên ...

dimstyle1.png

dimstyle2.png

Cảm ơn các anh chị em.

Mới trả lời cho bạn hochoaihetdot vừa xong :rolleyes:

http://www.cadviet.com/forum/index.php?showtopic=48373

  • 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 dùng lệnh "SETVAR" để biết được các thông tin của bản vẽ hiện hành.

Còn để lấy thông tin thì bạn dùng hàm "GETVAR". Ví dụ để lấy style của dimension:

(setq txt (getvar "dimstyle"))

v.v...

 

Cảm ơn Doan Van Ha và TUE_NV đã quan tâm giúp đỡ.

Mình xin lỗi vì mình dốt quá nên đặt vấn đề không rõ. Nên phải hỏi lại lần thứ 2.

Vấn đề của mình không phải là lấy tên của Dimstyle hiện hành. Mà mình muốn các thông tin của Dimstyle đó,

Chẳng hạn bản vẽ của mình có 5 Dimstyle. Trong đó mình muốn có các thông tin về Dimstyle hiện hành chẳng hạn. Ví dụ Dimstyle hiện hành là tên là TKCG-D1_50 chẳng hạn. Mình muốn các thông tin của Dimstyle này như là :

+ Dim này đã được người dùng tạo ra có Color của Dimension line là màu gì

+ Dim này đã được người dùng tạo ra có Baseline Spacing của Dimension line là bao nhiêu?

+ Trong mục Symbols and Arrows thì Leader của Arrowheads là gì, là mũi tên hay gì gì...

+ Trong mục Text thì Dim này được người dùng tạo ra thiết lập TextStyle gì, Text Color màu gì, Text height là bao nhiêu

+ Scale factor được người dùng thiết lập là bao nhiêu

+ ..................................................

Nói chung là tấc cả các thông số của Dimstyle.

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


×