Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2854 replies to this topic

#761 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 13 July 2011 - 06:45 PM

đặt ở đây có nghĩa là gì? Là MOVE hay COPY hay là CREAT 1 thư mục mới. Và thư mục hiện hành được chỉ định thế nào? Bạn nói rõ 1 tí....

Ý là thế này: tôi có 1 thư mục chứa các file lsp, dcl... mà lệnh trong file lsp thì gọi dialoge trong file dcl. Thông thường, để load file dcl thì phải chỉ path cho nó. Vậy, dùng hàm lsp nào để đưa thư mục đó trở thành thư mục hiện hành, để khi load dcl không trở ngại nữa.
Hiện giờ tôi thường phải chép các file đó vào thư mục hiện hành hoặc add thêm thư mục đó làm thư mục hiện hành bằng lệnh Option nên không thích lắm.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#762 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 13 July 2011 - 10:42 PM

Đọc đường dẫn file lisp rồi add toàn bộ đường dẫn full vào Support Path là được chứ hè ^^
Hay ý bác là dùng (setenv "ACAD" path) ?
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#763 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 14 July 2011 - 08:27 AM

Đọc đường dẫn file lisp rồi add toàn bộ đường dẫn full vào Support Path là được chứ hè ^^
Hay ý bác là dùng (setenv "ACAD" path) ?

Có lẽ tôi diễn đạt hơi loằng ngoằng nên khó hiểu, sorry. Ý là thế này: tôi có 1 thư mục "A", bây giờ tôi muốn add "A" vào Support Path, nhưng bằng 1 hàm lsp chứ không phải dùng lệnh Options trong Tool để add. Có hàm lsp đấy hay không?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#764 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 14 July 2011 - 09:15 AM

Có lẽ tôi diễn đạt hơi loằng ngoằng nên khó hiểu, sorry. Ý là thế này: tôi có 1 thư mục "A", bây giờ tôi muốn add "A" vào Support Path, nhưng bằng 1 hàm lsp chứ không phải dùng lệnh Options trong Tool để add. Có hàm lsp đấy hay không?

Bạn dùng thử xem


(if (findfile "C:\\A")
(if (not (vl-string-search "C:\\A" (getenv "ACAD")))
(setenv "ACAD" (strcat (getenv "ACAD") ";" "C:\\A")
);;end if
(prompt "Folder C:\A Not Found!"))
);;end if

  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#765 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 14 July 2011 - 09:16 AM

Có lẽ tôi diễn đạt hơi loằng ngoằng nên khó hiểu, sorry. Ý là thế này: tôi có 1 thư mục "A", bây giờ tôi muốn add "A" vào Support Path, nhưng bằng 1 hàm lsp chứ không phải dùng lệnh Options trong Tool để add. Có hàm lsp đấy hay không?

-> Có
(getenv "ACAD")
-> nó sẽ hiện ra - toàn bộ đường dẫn Support path -> Lấy được biến Path
Thêm đường dẫn vào bằng hàm nối chuỗi strcat
(setenv "ACAD" path)
-> Set path mới
Mấy dòng hy vọng bạn giải quyết được
Bận quá :rolleyes:

Detailing "giả nhời" nhanh hơn 1 phút rồi.
Nên kiểm tra Path đó có tồn tại đường dẫn mà bạn định Add vào thêm như ý của bạn Detailing ở trên nữa bạn ĐVH
  • 1

#766 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 14 July 2011 - 11:47 AM

Và (có thể) nên kiểm tra độ dài tối đa của toàn bộ string nữa ^^

(if (and (< (strlen (strcat (getenv "ACAD") Path)) 800) ....)


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#767 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 15 July 2011 - 11:16 AM

Câu hỏi này hơi buồn cười nhưng mình đang có nhu cầu: Có cách nào để unload 1 lisp đã đuợc load vào bản vẽ không nhể. (không chơi cách tắt bản vẽ đi rồi mở lại nha)
Edit: Vừa mò thấy topic này, không ngờ cũng có người có nhu cầu giống mình. mọi thảo luận xin chuyển qua topic này nhé
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#768 damvinhduy

damvinhduy

    biết vẽ line

  • Members
  • PipPip
  • 27 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 20 July 2011 - 12:59 PM

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

#769 damvinhduy

damvinhduy

    biết vẽ line

  • Members
  • PipPip
  • 27 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 20 July 2011 - 01:06 PM

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

#770 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 20 July 2011 - 01:33 PM

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.

Sau khi có được tập SS gồm rất nhiều *Line, bạn viết thêm 1 đoạn check chiều dài như mọi người hướng dẫn, nếu thỏa mãn điều kiện của bạn thì thôi, không thỏa mãn thì loại nó khỏi tập SS bằng (ssdel ename ss), chỉ thế thôi mà. Nếu thực sự ưa thích coding, bạn hãy cố gắng tìm giải pháp cho mình trước khi hỏi 1 câu hỏi nào đó, vì như thế sẽ khiến bạn bị lệ thuộc rất nhiều vào lối suy nghĩ của người khsac. Chúc bạn thành công ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#771 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 July 2011 - 10:36 PM

Tôi muốn hỏi về hàm (ACET-UNDO-RESTORE) và hàm (ACET-CMD-EXIT): ý nghĩa và cú pháp của nó. Ai biết xin chỉ giùm.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#772 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 30 July 2011 - 08:29 AM

Các anh cho em hỏi làm sao lấy được màu sắc của 1 layer bất kỳ trong bản vẽ (Ví dụ layer hiện hành). Cảm ơn!
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#773 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 30 July 2011 - 08:54 AM

Các anh cho em hỏi làm sao lấy được màu sắc của 1 layer bất kỳ trong bản vẽ (Ví dụ layer hiện hành). Cảm ơn!

(setq mau (getvar "cecolor"))
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#774 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 30 July 2011 - 09:19 AM

(setq mau (getvar "cecolor"))


Cảm ơn Doan Van Ha đã trả lời giúp.
Nhưng biến cecolor chỉ trả lại màu sắc đang dùng thôi.
Còn em muốn màu sắc của 1 Layer bất kỳ (chẳng hạn Layer hiện hành) Tức là màu sắc của layer đó khi ta tạo Layer.
Không biết bác không hiểu ý em hay em không hiểu ý bác!
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#775 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 30 July 2011 - 09:26 AM

Cảm ơn Doan Van Ha đã trả lời giúp.
Nhưng biến cecolor chỉ trả lại màu sắc đang dùng thôi.
Còn em muốn màu sắc của 1 Layer bất kỳ (chẳng hạn Layer hiện hành) Tức là màu sắc của layer đó khi ta tạo Layer.
Không biết bác không hiểu ý em hay em không hiểu ý bác!

"cecolor" là màu sắc của lớp hiện hành. "bác không hiểu ý em hay em không hiểu ý bác". Nói tóm lại, bạn muốn gì cơ?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#776 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 30 July 2011 - 09:28 AM

Cảm ơn Doan Van Ha đã trả lời giúp.
Nhưng biến cecolor chỉ trả lại màu sắc đang dùng thôi.
Còn em muốn màu sắc của 1 Layer bất kỳ (chẳng hạn Layer hiện hành) Tức là màu sắc của layer đó khi ta tạo Layer.
Không biết bác không hiểu ý em hay em không hiểu ý bác!

Đây bạn : (cdr(assoc 62 (tblsearch "layer" (getvar "clayer"))))

"cecolor" là màu sắc của lớp hiện hành. "bác không hiểu ý em hay em không hiểu ý bác". Nói tóm lại, bạn muốn gì cơ?

"cecolor" là màu sắc đang sử dụng hiện hành. Nếu là màu sắc của lớp hiện hành nó là Bylayer. Nó còn có thể có màu sắc khác nữa bạn.
  • 1

#777 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 30 July 2011 - 09:34 AM

Sẵn có siêu sao đang online, xin hỏi cái này chút:
Tôi muốn hỏi về hàm (ACET-UNDO-RESTORE) và hàm (ACET-CMD-EXIT): ý nghĩa và cú pháp của nó.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#778 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 30 July 2011 - 05:33 PM

Các anh cho em hỏi làm sao lấy được màu sắc của 1 layer bất kỳ trong bản vẽ (Ví dụ layer hiện hành). Cảm ơn!


Bạn có thể dùng Autolisp :

(defun layCl(layName)
(cdr(assoc 62 (tblsearch "layer" layName))))

Hoặc VLisp :

(defun layCl(layName)
(vla-get-color (vla-item (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) layName))
)

=> màu layer hiện hành (layCL (getvar "clayer"))\
Với các đối tượng thuộc collection thì bạn nên dùng Autolisp ,và thêm thắt kiểm tra sự tồn tại của layer nữa ^^


@DVH : Cú pháp :
(ACET-UNDO-RESTORE number)
(ACET-CMD-EXIT)
Ý nghĩa : :excl:
1.ACET-UNDO-RESTORE : gần như chưa thấy chỗ nào dùng nên hổng biết number nghĩa chi chi
2.ACET-CMD-EXIT : Không đối số, ghi chú là ;;undo command exit , cũng hổng biết dịch sao cho sát ý, nhưng theo ngu ý thì ket thấy nó cũng giống thoát lệnh hoặc dãy setq hiện tại để trả về Nil, như vậy thì các hàm command sau sẽ không bị ảnh hưởng bởi setq đằng trước (nhất là trong các vòng lặp hay gặp trường hợp command đằng sau bị ảnh hưởng bởi setq đằng trước), có sử dụng trong các file flattensup.lsp, brekl.lsp, plt2dwg.lsp, bác vào xem có khi ngộ ra ^^
  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#779 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 30 July 2011 - 09:26 PM

Sẵn có siêu sao đang online, xin hỏi cái này chút:
Tôi muốn hỏi về hàm (ACET-UNDO-RESTORE) và hàm (ACET-CMD-EXIT): ý nghĩa và cú pháp của nó.

Hàm (ACET-UNDO-RESTORE number)
- Number =0; =3 -> Vô hiệu hóa tính năng undo
Tương đương với
Command: undo
Current settings: Auto = Off, Control = One, Combine = Yes
Bạn quan sát biểu tượng mũi tên trên Toolbar của lệnh undo sẽ thấy rõ hơn

- Number = 2 : Only one command can be undone -> Undo chỉ được 1 lệnh thôi

Mọi vấn đề về hàm này bạn chỉ cần quan tâm đến biến hệ thống UNDOCTL là đủ. Ở đó có tất cả.

1 vấn đề nữa cần phải chú ý là trong hàm :
(command "undo" "be")
...
...
(command "undo" "end")
-> Nên set biến hệ thống UNDOCTL cho phù hợp. Và vì thường CAD mặc định nên chúng ta thường ít chú ý đến điểm này

PS: Mình còn phải học hỏi nhiều, mình dị ứng với các từ như cao thủ, siêu sao..bản thân không dám nhận và cũng rất ngại khi trả lời những bài viết có những từ này
  • 1

#780 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 30 July 2011 - 10:53 PM

Hàm (ACET-UNDO-RESTORE number)
- Number =0; =3 -> Vô hiệu hóa tính năng undo
Tương đương với
Command: undo
Current settings: Auto = Off, Control = One, Combine = Yes
Bạn quan sát biểu tượng mũi tên trên Toolbar của lệnh undo sẽ thấy rõ hơn

- Number = 2 : Only one command can be undone -> Undo chỉ được 1 lệnh thôi

Mọi vấn đề về hàm này bạn chỉ cần quan tâm đến biến hệ thống UNDOCTL là đủ. Ở đó có tất cả.

1 vấn đề nữa cần phải chú ý là trong hàm :
(command "undo" "be")
...
...
(command "undo" "end")
-> Nên set biến hệ thống UNDOCTL cho phù hợp. Và vì thường CAD mặc định nên chúng ta thường ít chú ý đến điểm này

PS: Mình còn phải học hỏi nhiều, mình dị ứng với các từ như cao thủ, siêu sao..bản thân không dám nhận và cũng rất ngại khi trả lời những bài viết có những từ này

Cám ơn Bác! Mới đọc xong, và sẽ nghiên cứu xem sao. Còn "siêu sao" là từ kính trọng của tôi. Tôi biết ai cũng cần phải học hỏi, nếu Bác có phật lòng thì tôi sorry. Bác cũng bỏ qua cho những lần tôi tranh luận với Bác, tất cả cũng chỉ vì học hỏi mà.
Thân thương!

PS: biến UNDOCTL là read only thì làm sao Set cho nó được?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.