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ị

Mình đã viết 1 vài ứng dung trong đó có sử dung phương phap pick điểm có dùng grread. Và đây là giải pháp của mình để giải quyết vấn đề osnap, nếu bạn thấy phù hợp thì có thể áp dung.

 

- Về phương pháp truy bắt điểm thì cũng gần tương tự cách thức của ông tây nào đó mà bạn đã post mấy hôm trước. Nghĩa là kết hợp giá trị biến hệ thong osmode với hàm osnap để tạo ra phương pháp truy bắt điểm đồng bộ với hệ thống các lệnh cad thông thường. Vì bạn đã nắm được cách thức rồi nên mình không đưa code lên đây nữa.

- Để điều khiển chế độ truy bắt điểm (Thay đổi giá trị biến Osmode) khi đang lặp grread thì mình rẽ nhánh tạm thời trong vòng lặp bằng sự kiện kích chuột phải. khi sự kiện này sảy ra thì gọi hộp thoại thay đổi chế độ bắt điểm (command "Dsettings"). Ưu điểm của phương pháp này so với cách của bạn (nếu bạn thành công) là bạn không cần phải đặt 1 thanh công cụ Snap toolbar thường trực lên màn hình làm việc gây tốn diện tích; có thể cho phép bắt điểm theo nhiều chế độ như lệnh cad thong thường chứ không chi 1 chế độ bắt điểm như cách của bạn; Gọi hộp thoại điều khiển bắt điểm chỉ bang 1 cú nháy chuột. Ngược lại, nhược điểm của nó là không 1 phát ăn ngay như khi pick vào toolbar.

- Về việc zoom bằng nút zoom trên toolbar thì mình chịu, nhưng không hiểu lý do gì bạn lại cần zoom theo cách này trong khi việc zoom bang chuột vẫn thực hiện được bình thường trong khi lặp grread?

  • 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

1). OK

2). Tốt quá! Mình cứ chăm bẳm vào mấy button trên toolbar mà quên mất chuột phải. Nhưng code 25 của chuột phải có "ổn định" không bạn ơi?

3). Mình chưa rõ zoom bằng chuột phải khi grread. Vì kiểu zoom chưa biết trước, bạn có thể nói rõ hơn khô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

- Chuột phải ổn định hay không thì bạn phải test thử thôi. Mình không gặp vấn đề gì với nó bao giờ, nhưng cũng có thể là chưa gặp. Tốt nhất là bạn nên tự kiểm chứng với 1 số máy.

- Zoom bang chuột có nghĩa là cuộn chuột giữa để zoom to nhỏ như bình thường chứ sao lại zoom bằng chuột phải nhỉ, kể cả pan cũng vậy. mình hiều sai gì chăng (!?)

  • 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

- Chuột phải ổn định hay không thì bạn phải test thử thôi. Mình không gặp vấn đề gì với nó bao giờ, nhưng cũng có thể là chưa gặp. Tốt nhất là bạn nên tự kiểm chứng với 1 số máy.

- Zoom bang chuột có nghĩa là cuộn chuột giữa để zoom to nhỏ như bình thường chứ sao lại zoom bằng chuột phải nhỉ, kể cả pan cũng vậy. mình hiều sai gì chăng (!?)

Dẫu chưa toại nguyện tuyệt đối nhưng như vậy là tốt lắm rồi, bởi hàm grread khó xơi quá. Cám ơn bạ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

Mấy huynh ơi chỉ nhoc cách ap dụng lệnh hatch trong lsp với, nhoc làm hoài ko đc ^^, nhoc ngĩ đơn giản mà ko :)

nhoc viết thế lày

(defun c:tth (/ p1)

(setq p1 (getpoint "\nPick tam:"))

(command "-hatch" "ANSI31" "1" "0" p1 "")

)

khi nhập lệnh xong nó hỏi pick tâm, pick xong trên màn hình nó hiện thông báo này "2D point or option keyword required. Specify internal point or :"

Còn dòng command hiện thế này

Specify internal point or [Properties/Select objects/draW boundary/remove

Boundaries/Advanced/DRaw order/Origin/ANnotative/hatch

COlor/LAyer/Transparency]:

Pick tiep vào vùng đó thì nó hatch đc nhưng ko thoát lệnh đc, nó hỏi tiep >>space 1 cái nó mới thoát

Mấy huynh chỉ nhoc chỗ sai hay thiếu với :D, nhoc đa tạ nhiề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

Sau cũng được. Ví dụ:

(command "-hatch" "p" "ansi31" 1 0 p1 "")

Chữ "P" là Properties.

Nói chung khi dùng hàm command: cad hỏi gì thì trả lời nấy. Cách nào cad chịu thì lisp ok.

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

oh xém tí lại hỉu sai rùi ^^, cứ nghĩ p là tham số chọn điểm pick là point ko phải object, nhưng trong bảng hatch nhoc đâu thấy chổ nào là properties ta, tại sao lại phải có propertis thì cad mới chịu 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

oh con đường học lsp của nhoc chắc còn dài đây :D, nhoc chưa pit khái niệm dialog là rì^^, chắc anh Ket chưa dạy tới

Ps: thanks anh HA nhiề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

Các ace cho mình hỏi với: Trong lisp có hàm nào cho phép thay thế phần tử này bằng phần tử khác tại vị trí được chỉ định không. (Nếu không có xin nhờ các mode viết giúp giùm mình với).

VD

- List ban đầu : ((-1 . <Entities:...>) (10 . 2) (11 . 2) .....(11 . "3") (301 . 5)..))

- Muốn thay (11 . "3") bằng (11 . "4") tại vị trí của "em" (11 . "3") .List sau khi thay là: ((-1 . <Entities:...>) (10 . 2) (11 . 2) .....(11 . "4") (301 . 5)..))

- Lưu ý: trong list ban đầu có thể có nhiều phần tử giống mã nhau (VD trên là mã 11)

Ứng dụng : mình muốn tạo ra một multileader khác từ một multileader đã có.

Chân thành cảm ơn mọi người

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ác ace cho mình hỏi với: Trong lisp có hàm nào cho phép thay thế phần tử này bằng phần tử khác tại vị trí được chỉ định không. (Nếu không có xin nhờ các mode viết giúp giùm mình với).

VD

- List ban đầu : ((-1 . <Entities:...>) (10 . 2) (11 . 2) .....(11 . "3") (301 . 5)..))

- Muốn thay (11 . "3") bằng (11 . "4") tại vị trí của "em" (11 . "3") .List sau khi thay là: ((-1 . <Entities:...>) (10 . 2) (11 . 2) .....(11 . "4") (301 . 5)..))

- Lưu ý: trong list ban đầu có thể có nhiều phần tử giống mã nhau (VD trên là mã 11)

Ứng dụng : mình muốn tạo ra một multileader khác từ một multileader đã có.

Chân thành cảm ơn mọi người

 

Bạn dùng:

(subst newitem olditem lst)

newitem An atom or list.

olditem An atom or list.

lst A list.

Return Values

A list, with newitem replacing all occurrences of olditem. If olditem is not found in lst, subst returns lst unchanged.

 

Tham khảo thêm hàm entupd

  • 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ác bạn coi giúp giùm mình đọan test sau, sai chỗ nào mà mình tìm không rahttp://www.cadviet.c..._textlist_1.txt

(setq en (nentsel))

(<Entity name: 7ee8d600> (15.9828 8.05911 0.0)) => Trong này đâu có cái nào là 302 đâu.

(subst '(302 . "2") '(302 . "1") en) => sai chỗ này. Muốn thay thế thì phải (entget (car (en)))

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

(entmod (subst (cons 302 "2") (cons 302 "1") (entget (car en))))

(entupd)

Cảm ơn các Bác đã giúp đỡ. Đúng như bác ĐVH đã chỉ : phải entmode mới đượ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

Mình có DimStyle tên là "1.4". Bây giờ mình muốn chọn tất cả các LEADER có DimStyle là "1.4" mình dùng đoạn code sau:

(sssetfirst nil (ssget "X" (list (cons 0 "leader") (cons 3 "1.4")))) nhưng lại báo nil. Bạn nào có thể giải thích được không. Xin cảm ơ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ó thể nó không phải là LEADER mà là MULTILEADER.

 

Mà thằng MULTILEADER không lọc theo DimStyle đượ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

Mình có viết lisp này đế xác định tâm của 1 hình kín, trước đây dùng bình thường giờ dùng lại thì bị báo lỗi này: "ActiveX Server returned the error: unknown name:

CENTROID"

Nhờ a e chỉ cách khắc phục với.

(defun c:tam ( / SS i ent P)
 (vl-load-com)
(princ "\nChon cac doi tuong khep kin")
(setq  SS (ssget)
i 0
)
(repeat (sslength SS)
(setq  ent (ssname SS i)
P (vlax-safearray->list
      	(vlax-variant-value
        	(vlax-get-property
          	(vlax-ename->vla-object ent)
          	'Centroid
        	)
      	)
    	)
i (1+ i)
)
(command "CIRCLE" P 1)
)
(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

Bạn chạy với đối tượng không có CENTROID thì nó lỗi là phải rồi. Nên catch error trong trường hợp này. và bắt buộc phải thêm điều kiện convert đối tượng về region (để lấy CENTROID)

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 chạy với đối tượng không có CENTROID thì nó lỗi là phải rồi. Nên catch error trong trường hợp này. và bắt buộc phải thêm điều kiện conver đối tượng về region (để lấy CENTROID)

Lâu ngày không dùng lisp này nên quên bước quan trọng này, nhờ 2 bạn nhắc mới nhớ ra. Mình hay "xào, nấu lisp" với đi "mót" nên kiến thức về lisp chưa vững lắm. Nếu không convert thì có thuật toán gì đế lấy tâm của hình kín khô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

Tham khảo code của LM (tuy chưa hoàn hảo lắm). Trên CV cũng đã có nhưng tôi không nhớ nằm ở đâu.

(defun c:pc ( / acdoc acspc acsel reg ) (vl-load-com) ;; © Lee Mac 2011
(setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
      	acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace)))
(if (ssget '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1)))
 (progn
  (vlax-for obj (setq acsel (vla-get-ActiveSelectionSet acdoc))
  (vlax-invoke acspc 'addpoint
(trans (vlax-get (setq reg (car (vlax-invoke acspc 'addregion (list obj)))) 'Centroid) 1 0))
  (vla-delete reg))
 (vla-delete acsel)))
(princ))

  • 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ạ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

×