Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

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

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

Các anh chị ơi có thể giúp em viết lisp này với! em cũng mới bước vào nghề nên không biết nhiều về lisp lắm! các anh giúp giùm nha! nội dung của nó như sau :" Tính tổng chiều dài của các đối tượng đường thẳng được chọn" thank các anh chị 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 Pro chỉ giúp xem giùm em cái? "Đây là lisp tính diện tích của các miền bằng cách tích điểm?" Nhưng sau khi thực hiện xong lệnh thì bước cài đặt của "OSNAP SETTing quay về 0, tức là không truy bắt được điểm nữa"?

http://www.cadviet.com/upfiles/2/dtsuaar.lsp

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

Xin giúp mình lisp như sau:

- chọn các đối tượng thuộc các layer khác nhau cho vào một layer mới, nhưng vẫn giữ nguyên màu của các đối tượng này (không phụ thuộc vào màu của layer mới tạo)

- cảm ơn các bá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
Xin giúp mình lisp như sau:

- chọn các đối tượng thuộc các layer khác nhau cho vào một layer mới, nhưng vẫn giữ nguyên màu của các đối tượng này (không phụ thuộc vào màu của layer mới tạo)

- cảm ơn các bác!

Layer mới chọn bằng cách nào bạn. Cố định hay hiển thị danh sách các layer hiện có rồi bạn chọ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
Xin giúp mình lisp như sau:

- chọn các đối tượng thuộc các layer khác nhau cho vào một layer mới, nhưng vẫn giữ nguyên màu của các đối tượng này (không phụ thuộc vào màu của layer mới tạo)

- cảm ơn các bác!

Yêu cầu của bạn đuợc diễn dịch như sau :

1/- trong tập hợp chọn : chuyển màu của các đối tuợng có màu ByLayer về màu Layer của đối tuợng đó.

2/- chuyển các đối tuợng thuộc tập hợp trên về 1 Layer nào đó (mới tạo ra)

 

buớc 1 thì Lisp trên diễn đàn đã có. (vui lòng tìm kiếm)

buớc 2 thì .......... chắc phải nhờ đến chuyên gia thui. :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
Xin giúp mình lisp như sau:

- chọn các đối tượng thuộc các layer khác nhau cho vào một layer mới, nhưng vẫn giữ nguyên màu của các đối tượng này (không phụ thuộc vào màu của layer mới tạo)

- cảm ơn các bác!

Chào bạn quynhnn,

Bạn dùng thử lisp này coi sao. Dựa trên sự gợi ý của bác Gia bach mình viết lại. Nếu có gì chưa vừa ý, hãy post lên nhé.

(defun c:chla (/ nla ss n i lst ent la lsol m )
(setq nla (getstring "\n Nhap ten layer dich: "))
(if (not (tblsearch "layer" nla))
(command "layer" "n" nla "c" "red" nla "")
)
(setq ss (ssget)
     n (sslength ss)
     i 0 )
(while ((setq ent (ssname ss i)
     lst (entget ent))
(if (= (assoc 62 lst) nil)
(progn
(setq la (cdr (assoc 8 lst)))
(setq lsol (tblnext "layer" T))
(while (/= la (cdr (assoc 2 lsol)))
(setq lsol (tblnext "layer"))
)
(setq m (cdr(assoc 62 lsol)))
(setq lst (append lst (list (cons 62 m))))
(entmod lst)
)
)
(setq i (1+ i))
)
(command "change" ss "" "p" "la" nla "")
(princ)
)

Chúc bạn vui.

  • 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
Chào bạn quynhnn,

Bạn dùng thử lisp này coi sao. Dựa trên sự gợi ý của bác Gia bach mình viết lại. Nếu có gì chưa vừa ý, hãy post lên nhé.

(defun c:chla (/ nla ss n i lst ent la lsol m )
(setq nla (getstring "\n Nhap ten layer dich: "))
(if (not (tblsearch "layer" nla))
(command "layer" "n" nla "c" "red" nla "")
)
(setq ss (ssget)
n (sslength ss)
i 0 )
(while (< i n)
(setq ent (ssname ss i)
lst (entget ent))
(if (= (assoc 62 lst) nil)
(progn
(setq la (cdr (assoc 8 lst)))
(setq lsol (tblnext "layer" T))
(while (/= la (cdr (assoc 2 lsol)))
(setq lsol (tblnext "layer"))
)
(setq m (cdr(assoc 62 lsol)))
(setq lst (append lst (list (cons 62 m))))
(entmod lst)
)
)
(setq i (1+ i))
)
(command "change" ss "" "p" "la" nla "")
(princ)
)

Chúc bạn vui.

 

 

Tôi thấy dùng rất hay tuy nhiên còn vấn đền là linetype bị thay đổi theo lớp mới nếu giữ được linetype cũ như màu thi tốt qua!

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 thấy dùng rất hay tuy nhiên còn vấn đền là linetype bị thay đổi theo lớp mới nếu giữ được linetype cũ như màu thi tốt qua!

Bạn thay dòng này :

(command "change" ss "" "p" "la" nla "")

Bằng dòng này :

(command "change" ss "" "p" "la" nla "LT" (cdr(assoc 6 lsol)) "")

là đượ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
Bạn thay dòng này :

(command "change" ss "" "p" "la" nla "")

Bằng dòng này :

(command "change" ss "" "p" "la" nla "LT" (cdr(assoc 6 lsol)) "")

là được

Chào bác Tue_NV,

Bác xem lại xem vì dòng code (command "change" ss "" "p" "la" nla "LT" (cdr(assoc 6 lsol)) "") này nằm ngoài vòng lặp Whlie cho nên hàm (cdr(assoc 6 lsol)) sẽ nhận giá trị của linetype ở lớp cuối cùng chứa đối tượng có màu là bylayer.

Do vậy tất cả tập chọn ss đều bị đổi thành linetype này chứ không giữ nguyên được linetype của nó như cũ bác ạ.

Cái lisp của mình sẽ giữ nguyên linetype của đối tượng nếu như nó không phải là bylayer.

Để có thể thỏa mãn yêu cầu của bạn chandatn theo mình hiểu thì cũng phải làm y như đối với việc giữ màu của đối tượng vậy, nghĩa là trước hết phải đổi linetype của đối tượng từ bylayer thành linetype có tên tương ứng, tức là làm cho đối tượng có thêm mã DXF số 6 bác ạ.

Muốn vậy ta thêm một hàm điều kiện if nữa vào trong vòng lặp while.

(if (= (assoc 6 lst) nil)

(progn

(setq la (cdr (assoc 8 lst)))

(setq lsol (tblnext "layer" T))

(while (/= la (cdr (assoc 2 lsol)))

(setq lsol (tblnext "layer"))

)

(setq k (cdr(assoc 6 lsol)))

(setq lst (append lst (list (cons 6 k))))

(entmod lst)

)

)

Và như vậy cái lisp cũ trở thành:

(defun c:chla (/ nla ss n i lst ent la lsol m k)
(setq nla (getstring "\n Nhap ten layer dich: "))
(if (not (tblsearch "layer" nla))
(command "layer" "n" nla "c" "red" nla "")
)
(setq ss (ssget)
     n (sslength ss)
     i 0 )
(while ((setq ent (ssname ss i)
     lst (entget ent))
(setq la (cdr (assoc 8 lst)))
(setq lsol (tblsearch "layer" la))
(if (= (assoc 62 lst) nil)
(progn
(setq m (cdr(assoc 62 lsol)))
(setq lst (append lst (list (cons 62 m))))
(entmod lst)
)
)
(if (= (assoc 6 lst) nil)
(progn
(setq k (cdr(assoc 6 lsol)))
(setq lst (append lst (list (cons 6 k))))
(entmod lst)
)
)
(setq i (1+ i))
)
(command "change" ss "" "p" "la" nla "")
(princ)
)

 

@ ban chandatn: Bạn hãy thử lisp này xem còn phải chỉnh sửa gì nữa không nhé.

 

Bài được edit bởi Phạm Thanh Bình theo sự góp ý của bác Giabach

  • 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
Các anh chị ơi có thể giúp em viết lisp này với! em cũng mới bước vào nghề nên không biết nhiều về lisp lắm! các anh giúp giùm nha! nội dung của nó như sau :" Tính tổng chiều dài của các đối tượng đường thẳng được chọn" thank các anh chị nhiều

Chào bạn minhthuantp,

Hãy chịu khó tìm kiếm trên diễn đàn bạn nhé. Lisp này chắc chắn đã có, bây giờ ngồi viết lại e thành dở hơi mất bạn ạ. Hãy cố gắng tìm kiếm trước khi post yêu cầu của bạn.

Chúc bạn vui,

  • 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
Đơn giản nhất thì bạn dùng lệnh của list lệnh CAD như sau: (thực hiện ngay sau khi vẽ đường thẳng)

 

(defun c:2()

(command "-layer" "S" "DUONGBAO" "")

(command ".change" "l" "" "p" "c" "bylayer" "la" "DUONGBAO" "")

(princ)

)

Cứ tương tự bạn triển khai với các đối tượng khác.

@@Chúc thành công. (Mình đang tập học LSP những lệnh này là đơn giản nhất của LSP, bạn nên học để dễ tùy biến cho công viêc.)

Lisp này chỉ chuyển thành layer của đối tượng vẽ sau cùng thôi,thí dụ ta vẽ 10 đường thẳng Layer hiện hành là thép chẳng hạn,khi cần chuyển 1 layer nào đó sang đường bao thì không được,chỉ chuyển được đường vẽ cuối cùng thôi.Mong các bác sửa giùm.Thanks.

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
Lisp này chỉ chuyển thành layer của đối tượng vẽ sau cùng thôi,thí dụ ta vẽ 10 đường thẳng Layer hiện hành là thép chẳng hạn,khi cần chuyển 1 layer nào đó sang đường bao thì không được,chỉ chuyển được đường vẽ cuối cùng thôi.Mong các bác sửa giùm.Thanks.

 

Bạn giải thích rõ hơn. Nhưng nếu bạn muốn chuyển một tập hợp đường thẳng nào thành Layer "DUONGBAO" thì dùng cái này

 

(defun c:2()
(SSGET)
(command ".change" "P" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)

 

@: Bạn có thể thay thế Layer "DUONGBAO" thành các Layer khác nhưng nhớ để trong dấ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
Bạn giải thích rõ hơn. Nhưng nếu bạn muốn chuyển một tập hợp đường thẳng nào thành Layer "DUONGBAO" thì dùng cái này

 

(defun c:2()
(SSGET)
(command ".change" "P" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)

 

@: Bạn có thể thay thế Layer "DUONGBAO" thành các Layer khác nhưng nhớ để trong dấu "".

Lisp này được nhưng bạn thêm vào sao khi ta chọn đường thẳng bất kỳ rồi nhấn số 2 thì đường này chuyển thành màu DUONGBAO nhưng layer hiên hành sẽ chuyển về DUONGBAO luôn.Cảm ơn bạn rấ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
Bạn giải thích rõ hơn. Nhưng nếu bạn muốn chuyển một tập hợp đường thẳng nào thành Layer "DUONGBAO" thì dùng cái này

 

(defun c:2()
(SSGET)
(command ".change" "P" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)

 

@: Bạn có thể thay thế Layer "DUONGBAO" thành các Layer khác nhưng nhớ để trong dấu "".

Góp ý với bạn dkkx3a :

Trường hợp chạy Lisp mà mình không chọn đối tượng nào cả thì vô tình Lisp sẽ chọn đối tượng trước đó và thay đổi về Layer DUONGBAO mất. Đây là điều User không mong muốn. Bạn nên đưa hàm if vào để code hoàn thiện hơn

Chào bạn

  • 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
Chào bạn quynhnn,

Bạn dùng thử lisp này coi sao. Dựa trên sự gợi ý của bác Gia bach mình viết lại. Nếu có gì chưa vừa ý, hãy post lên nhé.

(defun c:chla (/ nla ss n i lst ent la lsol m )
(setq nla (getstring "\n Nhap ten layer dich: "))
(if (not (tblsearch "layer" nla))
(command "layer" "n" nla "c" "red" nla "")
)
(setq ss (ssget)
     n (sslength ss)
     i 0 )
(while (< i n)
(setq ent (ssname ss i)
     lst (entget ent))
(if (= (assoc 62 lst) nil)
(progn
(setq la (cdr (assoc 8 lst)))
(setq lsol (tblnext "layer" T))
(while (/= la (cdr (assoc 2 lsol)))
(setq lsol (tblnext "layer"))
)
(setq m (cdr(assoc 62 lsol)))
(setq lst (append lst (list (cons 62 m))))
(entmod lst)
)
)
(setq i (1+ i))
)
(command "change" ss "" "p" "la" nla "")
(princ)
)

Chúc bạn vui.

Chào bác phamthanhbinh

Mặc dù Lisp chla cho kết quả chính xác nhưng Bác có thể tối ưu Lisp trên bằng cách thay thế 3 dòng :

(setq lsol (tblnext "layer" T))

(while (/= la (cdr (assoc 2 lsol)))

(setq lsol (tblnext "layer"))

)

bằng dòng : (setq lsol (tblsearch "layer" la))

  • 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 bác Tue_NV,

Bác xem lại xem vì dòng code (command "change" ss "" "p" "la" nla "LT" (cdr(assoc 6 lsol)) "") này nằm ngoài vòng lặp Whlie cho nên hàm (cdr(assoc 6 lsol)) sẽ nhận giá trị của linetype ở lớp cuối cùng chứa đối tượng có màu là bylayer.

Do vậy tất cả tập chọn ss đều bị đổi thành linetype này chứ không giữ nguyên được linetype của nó như cũ bác ạ.

Cái lisp của mình sẽ giữ nguyên linetype của đối tượng nếu như nó không phải là bylayer.

Để có thể thỏa mãn yêu cầu của bạn chandatn theo mình hiểu thì cũng phải làm y như đối với việc giữ màu của đối tượng vậy, nghĩa là trước hết phải đổi linetype của đối tượng từ bylayer thành linetype có tên tương ứng, tức là làm cho đối tượng có thêm mã DXF số 6 bác ạ.

Cám ơn các bác nhiều lắm!

Tôi thấy trình độ của mọi người quả là siêu phàm. Trình độ của tôi ABC quá nên phải nhờ vả mọi người chỉ dẫn thêm!

Nếu muốn biết các mã của DXF (như ví dụ như mã DXF số 6 để đọc linetype ) thì xem ở đâu các bac

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

Nếu muốn biết các mã của DXF (như ví dụ như mã DXF số 6 để đọc linetype ) thì xem ở đâu các bac

Bạn xem trong Help Developer Documentation : DXF Reference

Chú ý tab ENTITIES Section

dxf.jpg

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_NV,

Bác xem lại xem vì dòng code (command "change" ss "" "p" "la" nla "LT" (cdr(assoc 6 lsol)) "") này nằm ngoài vòng lặp Whlie cho nên hàm (cdr(assoc 6 lsol)) sẽ nhận giá trị của linetype ở lớp cuối cùng chứa đối tượng có màu là bylayer.

Do vậy tất cả tập chọn ss đều bị đổi thành linetype này chứ không giữ nguyên được linetype của nó như cũ bác ạ.

Cái lisp của mình sẽ giữ nguyên linetype của đối tượng nếu như nó không phải là bylayer.

Để có thể thỏa mãn yêu cầu của bạn chandatn theo mình hiểu thì cũng phải làm y như đối với việc giữ màu của đối tượng vậy, nghĩa là trước hết phải đổi linetype của đối tượng từ bylayer thành linetype có tên tương ứng, tức là làm cho đối tượng có thêm mã DXF số 6 bác ạ.

Cám ơn các bác nhiều lắm!

Tôi thấy trình độ của mọi người quả là siêu phàm. Trình độ của tôi ABC quá nên phải nhờ vả mọi người chỉ dẫn thêm!

Nếu muốn biết các mã của DXF (như ví dụ như mã DXF số 6 để đọc linetype ) thì xem ở đâu các bac

Chào bạn chandatn,

Tất cả các đối tượng trong Cad đều được quản lý bởi các mã DXF của chúng. Để xem các mã DXF của một đối tượng bạn sử dụng hàm (entget(car(entsel))) và chọn đối tượng muốn xem.

Để hiểu được các mã này bạn nên tìm hiểu kỹ trong phần hướng dẫn Help của CAD.

Việc hiểu các mã này không quá khó, chỉ cần bạn lưu tâm thì sau một thời gian ngắn bạn sẽ rõ. Việc thuộc các mã này sẽ giúp bạn thuận lợi hơn khi sử dụng nhưng không nhất thiết phải thuộc đâu bạn ạ. Nó khá nhiều và bạn chỉ cần nhớ vài cái chính hay dùng, còn đâu thì mỗi khi cần dùng bạn có thể mở Help ra để tham khảo lại cũng nhanh thôi.

Bạn có thể tham khảo các bài hướng dẫn lập trình lisp có trên diễn đàn và thực hành dần dần sẽ quen thôi, đừng ngại nếu gặp phải khó khăn. Bất cứ khi nào bạn cần đều có thể post yêu cầu của bạn lên mọi người sẽ hỗ trợ. Tuy nhiên việc bạn hiểu và ứng dụng được lisp vào trong côg việc sẽ giúp bạn làm chủ công việc của mình và chủ động hơn nhiều bạn ạ.

Chúc bạn 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

Nhờ các Bác kiểm tra và thêm một số tùy chọn cho lisp sau nhé:

1- Lưu lai tùy chọn bắt điểm hiện tại.

2- Bật bắt điểm hiện tại là: điểm cuối và giao của các đường thẳng.

3- Kết thúc lệnh phục hồi tùy bắt điểm ban đầu, và xuất hiện nội dung “Can phai chuyen tat cac cac doi tuong dam ve Layer Fram” lên màn hình.

 

Một số lỗi không biết cách khắc phục:

1- sau mỗi lần chọn đỉnh cọc lại xuất hiện dòng chữ “CS Unknown command "CS". Press F1 for help”

2- Sao lúc Enter kết thúc lệnh thì có báo lỗi như sau:

; error: bad argument type: numberp: nil

 

Cảm ơn các Bác nhé.

 


; Doi voi mot so ket cau nhu cau tau, tru neo. Thuong co truong hop coc xien trong khong gian,
; Lisp nay giup ve nhanh mo hinh ket cau 3D ngay tren cua so 2D cua ACAD ma khong can phai biet ve trong 3D.
; (chi ve phan coc va dam ....)
; Lenh ve 	CS
; Huong dan 	HD

(defun c:cs()
(command "layer" "m" "Fram" "c" 2 "" "")
(princ "\n Lisp Ve coc khong gian - ung dung lap mo hinh cho SAP tu ACAD: Tvduc")
(setq
	Lu (getdist "\n Nhap chieu dai chiu uon:    ")
	m (getdist "\n Nhap do xien cua coc 1/m:    ")
)
	(while (< m 5)
		(alert"Ban oi! Do xien cua coc phai la so duong, va khong duoc xien qua 1/5,lam on nhap lai nhe!")
		; Tuy thuoc vao tung cong trinh cu the ma do xien cua coc co the vuot ngoai gia tri tren.  
		(setq m (getdist "\n Nhap lai do xien cua coc 1/m:    "))
	)
	(while (> m 10)
		(alert"Ban oi! Do xien cua coc nho hon 1/10 khong co y nghia, xem lai ket cau nhe!")  
		(setq m (getdist "\n Nhap lai do xien cua coc 1/m:    "))
	)
(setq
	a (getdist "\n Nhap goc xoay cua coc:    ")
)
	(while (or (< a -45)(> a 45))
		(alert"Ban oi! Góc xoay co gia tri tu -45 den +45 do^. thoi!  Lam on nhap lai nhe.")  
		(setq a (getdist "\n Coc xoay quan truc:   "))
		; Tuy thuoc tung bai toan cu the.
	)
(setq 		
	aa (getdist "\n Coc xoay quan truc:   ")
)
	(while (and (/= aa 1)(/= aa 2)(/= aa 3)(/= aa 4))
		(alert"Ban oi! Chieu duong truc x la truc 1,   Chieu duong truc y la truc 2,   Chieu am truc x la truc 3,   Chieu am truc y la truc 4!   Lam on nhap lai nhe.")  
		(setq aa (getdist "\n Coc xoay quan truc:   "))
	)
(setq
	a (+ (* (- aa 1) 90) a)
	xy (/ Lu m)
	x (* xy (cos (/ (* a pi) 180)))
	y (* xy (sin(/ (* a pi) 180)))
)
(while
	(setq
		p1 (getpoint "\n Vi tri dinh coc ?")
		p2 (list (+ (car p1) x) (+ (cadr p1) y) (- 0 Lu))
	)
	(command "_line" p1 p2 "" "")
)
(princ "\n Can phai chuyen tat cac cac doi tuong dam ve Layer Fram")
)
(defun c:hd ()
(print "Chieu duong cua goc xoay nguoc chieu voi kim dong ho")
(print "Goc toa do la dinh coc")	
(print "Chieu duong truc x la truc 1")
(print "Chieu duong truc y la truc 2")
(print "Chieu am truc x la truc 3")
(print "Chieu am truc y la truc 4")
(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
Lisp này được nhưng bạn thêm vào sao khi ta chọn đường thẳng bất kỳ rồi nhấn số 2 thì đường này chuyển thành màu DUONGBAO nhưng layer hiên hành sẽ chuyển về DUONGBAO luôn.Cảm ơn bạn rất nhiều.

 

Xin cảm ơn Bác Tuệ đã góp ý. Mình viết lại LISP cho bạn thế này:

(defun c:2(/ Ent_slc OLD_CMD)
(SETQ OLD_CMD (GETVAR "CMDECHO"))
(SETVAR "CMDECHO" 0)
(princ "\nChon cac doi tuong chuyen sang Layer DUONGBAO: ")
(setq Ent_slc (ssget '((0 . "POLYLINE,LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))))
(while (not Ent_slc)
(princ "\nChua chon duoc doi tuong: ")  
(setq Ent_slc (ssget '((0 . "POLYLINE,LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))))
)		  
(command ".change" Ent_slc "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(command "-layer" "S" "DUONGBAO" "")
(SETVAR "CMDECHO" OLD_CMD)
(princ "\nCac doi tuong da chuyen sang Layer DUONGBAO !!!")
(princ)
)

 

Có gì chưa đúng bạn cứ Post lê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
Xin cảm ơn Bác Tuệ đã góp ý. Mình viết lại LISP cho bạn thế này:

(defun c:2(/ Ent_slc OLD_CMD)
(SETQ OLD_CMD (GETVAR "CMDECHO"))
(SETVAR "CMDECHO" 0)
(princ "\nChon cac doi tuong chuyen sang Layer DUONGBAO: ")
(setq Ent_slc (ssget '((0 . "POLYLINE,LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))))
(while (not Ent_slc)
(princ "\nChua chon duoc doi tuong: ")  
(setq Ent_slc (ssget '((0 . "POLYLINE,LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))))
)		  
(command ".change" Ent_slc "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(command "-layer" "S" "DUONGBAO" "")
(SETVAR "CMDECHO" OLD_CMD)
(princ "\nCac doi tuong da chuyen sang Layer DUONGBAO !!!")
(princ)
)

 

Có gì chưa đúng bạn cứ Post lên.

Bạn nên thay hàm while bằng hàm if.

Trường hợp User không muốn chọn đối tượng nào cả thì nhấn Esc thoát vòng lặp While thì không tiện lắm

 

(defun c:2(/ Ent_slc OLD_CMD)

(SETQ OLD_CMD (GETVAR "CMDECHO"))

(SETVAR "CMDECHO" 0)

(princ "\nChon cac doi tuong chuyen sang Layer DUONGBAO: ")

(command "-layer" "N" "DUONGBAO" "")

 

(if (setq Ent_slc (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

(progn

(command ".change" Ent_slc "" "p" "c" "bylayer" "la" "DUONGBAO" "")

(princ "\nCac doi tuong da chuyen sang Layer DUONGBAO !!!")

)

(princ "\nChua chon duoc doi tuong: ")

)

 

(command "-layer" "S" "DUONGBAO" "")

(SETVAR "CMDECHO" OLD_CMD)

 

(princ)

)

  • 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
Bạn nên thay hàm while bằng hàm if.

Trường hợp User không muốn chọn đối tượng nào cả thì nhấn Esc thoát vòng lặp While thì không tiện lắm

 

(defun c:2(/ Ent_slc OLD_CMD)

(SETQ OLD_CMD (GETVAR "CMDECHO"))

(SETVAR "CMDECHO" 0)

(princ "\nChon cac doi tuong chuyen sang Layer DUONGBAO: ")

(command "-layer" "N" "DUONGBAO" "")

 

(if (setq Ent_slc (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

(progn

(command ".change" Ent_slc "" "p" "c" "bylayer" "la" "DUONGBAO" "")

(princ "\nCac doi tuong da chuyen sang Layer DUONGBAO !!!")

)

(princ "\nChua chon duoc doi tuong: ")

)

 

(command "-layer" "S" "DUONGBAO" "")

(SETVAR "CMDECHO" OLD_CMD)

 

(princ)

)

 

Thì mình cũng lưỡng lự khi viết cái này, nhưng bác ấy muốn chọn và ..., nên khi không chọn được thì nó đòi chọn thôi. "không ép mỡ ép duyên nhưng chọn thì.....ép". Hihi. Cảm ơn bác góp ý.

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ờ các Bác kiểm tra và thêm một số tùy chọn cho lisp sau nhé:

1- Lưu lai tùy chọn bắt điểm hiện tại.

2- Bật bắt điểm hiện tại là: điểm cuối và giao của các đường thẳng.

3- Kết thúc lệnh phục hồi tùy bắt điểm ban đầu, và xuất hiện nội dung “Can phai chuyen tat cac cac doi tuong dam ve Layer Fram” lên màn hình.

 

Một số lỗi không biết cách khắc phục:

1- sau mỗi lần chọn đỉnh cọc lại xuất hiện dòng chữ “CS Unknown command "CS". Press F1 for help”

2- Sao lúc Enter kết thúc lệnh thì có báo lỗi như sau:

; error: bad argument type: numberp: nil

 

Cảm ơn các Bác nhé.

(while

(setq

p1 (getpoint "\n Vi tri dinh coc ?")

p2 (list (+ (car p1) x) (+ (cadr p1) y) (- 0 Lu))

)

(command "_line" p1 p2 "" "")

)

(princ "\n Can phai chuyen tat cac cac doi tuong dam ve Layer Fram")

)

Một số lỗi không biết cách khắc phục:

Nó bị lỗi ngay ở các dòng trên

1./ 1- sau mỗi lần chọn đỉnh cọc lại xuất hiện dòng chữ “CS Unknown command "CS". Press F1 for help”

-> Lỗi này là do dòng (command "_line" p1 p2 "" "") -> bạn bị thừa 1 dấu "" -> phải viết là : (command "_line" p1 p2 ""). Dấu "" tương đương với phím Enter nên do bị thừa 1 dấu nên bạn bị lỗi như trên

2- Sao lúc Enter kết thúc lệnh thì có báo lỗi như sau:

; error: bad argument type: numberp: nil

 

-> Lỗi này là do điều kiện logic của hàm While không đúng -> biến p2 không xác định được và lệnh vẽ LINE trở nên vô nghĩa.

Tức là như thế này :

- Vào vòng While -> Kiểm tra điều kiện của biến P1 (nếu thoả : trường hợp bạn Pick 1 điểm trên màn hình) -> Lisp tính toán điểm P2 và vẽ LINE

. Và Trường hợp Kiểm tra điều kiện của biến P1 = nil (Khi bạn nhấn Enter ). vòng While -> Kiểm tra điều kiện của biến P1 không thoả (P1 =nil) => Kết quả tính toán P2 vô nghĩa và lệnh vẽ LINE bằng hàm Command cũng sẽ trở nên vô nghĩa là nó đã báo lỗi như bạn đã thấy.

- Cách sửa :

+ Vào vòng lặp While với điều kiện logic là kiểm tra P1

-> Dùng hàm if -> kiểm tra P1 -> Nếu P1 thoả -> Tính P2 -> Vẽ LINE. Nếu P1 không thoả sẽ thoát vòng lặp While

Code được sửa lại :

 

(while (setq p1 (getpoint "\n Vi tri dinh coc ?"))

(if p1

(progn

(setq p2 (list (+ (car p1) x) (+ (cadr p1) y) (- 0 Lu)))

(command "_line" p1 p2 "")

)

);if

);while

Bạn thay code mà Tue_NV đánh dấu màu xanh trong code của bạn và thay bằng code đánh dấu màu hồng mà Tue_NV sửa lại cho bạn và chạy thử nhé

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

×