Đế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
2851 replies to this topic

#21 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 12 April 2007 - 01:11 AM

Chưa bao giờ convert thành masselement nên cũng chẳng biết nó như thế nào.

Bowxman hướng dẫn thêm được không?
  • -1

#22 bowxman

bowxman

    biết vẽ pline

  • Members
  • PipPip
  • 69 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 12 April 2007 - 01:25 AM

Khối mass hay lém bác ơi, em cũng ko để ý là Cad có khối mass ko, vì em sử dụng desktop.
Khối mass có mass group, tháo ra tháo vô dễ dàng, giống như khối solid có record trong cad2007.
Nhưng nó có sai số ở khối tròn, phải hiệu chỉnh phần facet deviation để sai số nhỏ hơn.
  • 0

#23 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 01 May 2007 - 11:04 PM

Rất xin cảm ơn Bạn Hoành về phản hồi giúp đỡ ngay, tác phong như nhà binh chúng tôi! Kiến thức của tôi rất hạn chế, biết sơ về Cad, lơ mơ về Lisp mong các bạo chỉ giáo nhiều. Tôi thấy diễn đàn của mình rất hay, bổ ích và cao hơn là tiêu chí phục vụ hết mình, chia sẻ kiến thức, kinh nghiệm quý giá "TẤT CẢ VÌ CỘNG ĐỒNG CADVIET". Xin cảm ơn nhé!

Bạn Xvinh có hỏi thông qua PM rằng: khi dùng mã lisp sửa, bạn đã khắc phục được lỗi bắt điểm khi thoát khỏi lệnh. Nhưng trong lệnh vẫn bị tắt mất chức năng bắt điểm, chỉ có bắt intersect được chọn. Do diễn đàn trục trặc không gửi PM được nên trả lời bạn tại đây.

Trong đoạn mã của bạn, người viết đã chủ định chỉ bật từng chức năng bắt điểm. Cụ thể:
lệnh (setvar "osmode" 512) là chỉ bật chức năng bắt NEArest.
lệnh (setvar "osmode" 128) là chỉ bật chức năng PERpendicular
lệnh (setvar "osmode" 1) là chỉ bật chức năng ENDpoint

Muốn không tắt chức năng này, bạn chỉ cần vô hiệu hóa các mã (setvar "osmode" xxx) với xxx là một số khác 0. Bằng cách xóa dòng lệnh đó đi hoặc thêm dấu chấm phẩy (:lol: vào đầu dòng lệnh.

Đoạn mã mới sau khi loại bỏ các mã lệnh chỉ bật từng chức năng bắt điểm trở thành như sau:

(defun c:cu()
(setq old_osmode (getvar "osmode")
old_autosnap (getvar "autosnap")
)
;;(setvar "osmode" 512 )
(setq p1 (getpoint "\nfirst point :"))
(if (= nil p1)(sdor)(odor))
(if old_osmode (setvar "osmode" old_osmode))
(if old_autosnap (setvar "autosnap" old_autosnap))
)
(defun odor ()
(setq p2 (getpoint p1 "\nsecond point width open :"))
;;(setvar "osmode" 128 )
(setq p3 (getpoint p2 "\npick in wall :")
p31 (polar p1 (angle p2 p3) (distance p2 p3))
)
(setvar "osmode" 0 )
(command "line" p1 p31 "")
(setq s1 (entlast));de copy ve do cua so
(command "line" p2 p3 "" "trim" "c" p3 p1 ""
(polar p1 (angle p1 p2) (/ (distance p1 p2) 2))
(polar p31 (angle p1 p2) (/ (distance p1 p2) 2)) ""
)
(setq sel (strcase (getstring "\nWin Open :")))
(cond ((= sel "W")(openwin))
((= sel "")(opendor))
(T (princ))
)
(princ)
)
(defun sdor ()
;;(setvar "osmode" 1 )
(setq p1 (getpoint "\nfirst point :"))
(setq p2 (getpoint p1 "\nsecond point width open :"))
;;(setvar "osmode" 128 )
(setq p3 (getpoint p2 "\npick in wall :")
p31 (polar p1 (angle p2 p3) (distance p2 p3))
)
(setvar "osmode" 0 )
(command "line" p1 p31 "")
(setq s1 (entlast)) ;de copy ve do cua so
(setq sel (strcase (getstring "\nWin Open :")))
(cond ((= sel "W")(openwin))
((= sel "")(opendor))
(T (princ))
)
(princ)
)
;-----------
(defun opendor ()
(setq ang (getangle (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)) "\ndirection open :")
nsegdor (getint "\nnumber seg dor 2 4 <1> :")
)
(cond ((= nsegdor 2)(dor2 p1 p2 ang))
((= nsegdor 4)(dor4 p1 p2 ang))
(T (dor p1 p2 ang))
)
)
;----------
(defun dor4 (p1 p2 ang)
(setq p12 (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
(setq p112 (polar p1 (angle p1 p12) (/ (distance p1 p12) 2)))
(setq p122 (polar p12 (angle p1 p12) (/ (distance p1 p12) 2)))
(dor p1 p112 ang)(dor p112 p12 ang)(dor p2 p122 ang)(dor p122 p12 ang)
)
;----------
(defun dor2 (p1 p2 ang)
(setq p12 (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
(dor p1 p12 ang)(dor p2 p12 ang)
)
;----------
(defun dor (p1 p2 ang)
(setq ps1 (polar p1 (angle p1 p2) 0.5)
ps2 (polar ps1 ang (distance p1 p2))
ps3 (polar ps2 (angle p2 p1) 0.5)
)
(command "pline" ps3 ps2 ps1 p1 ps3 ps2 "a" p2 "" )
)
;----------
(defun openwin ()
(command "line" p1 p2 "" "line" p31 p3 ""
"line" (polar p1 (angle p2 p3) (/ (distance p2 p3) 2))
(polar p2 (angle p2 p3) (/ (distance p2 p3) 2)) ""
)
(setq nsegwin (getint "\nnumber seg win :")
disseg (/ (distance p1 p2) nsegwin)
)
(setq lispoiseg nil)
(repeat (- nsegwin 1)
(setq lispoiseg (append lispoiseg (list (polar p1 (angle p1 p2) (* (- nsegwin 1) disseg))))
nsegwin (- nsegwin 1)
)
)
(command "copy" s1 "" "m" p1)
(foreach p lispoiseg (command p))
(command "")
)
(PRINC)

  • 0

#24 lequang

lequang

    Chưa sử dụng CAD

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

Đã gửi 30 June 2007 - 12:38 PM

cho em hỏi câu này hơi củ chuối nghe :ph34r:
khi có những đoạn code của các sư fụ đưa rùi , nhưng em không biết làm cách nào load vào sử dụng trong cad hết :s_dead:
sư phụ chỉ giúp
  • 0

#25 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 30 June 2007 - 03:10 PM

cho em hỏi câu này hơi củ chuối nghe :ph34r:
khi có những đoạn code của các sư fụ đưa rùi , nhưng em không biết làm cách nào load vào sử dụng trong cad hết :s_dead:
sư phụ chỉ giúp

Bạn đọc ở đây nè: Cách sử dụng lisp

Một kinh nghiệm nữa khi tham gia diễn đàn là hãy sử dụng công cụ Search của diễn đàn, bạn sẽ thấy có những điều đã được bàn luận trước đó
  • 1

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#26 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 02 July 2007 - 11:09 AM

Em có thư mục chứa thư viện nằm trong CD. Có cách nào khi load file lisp nằm trong thu mục này thì nó gán cho biến tenduongan là đường dẩn thư mục chứa file líp này không.
Ví dụ: đường dẩn file lisp như thế này E:\BV\DUY\DUONGAN.LSP
sau khi load lên thì thu được biến tenđuongan là E:\BV\DUY\
Bác nào biết chỉ giúp với.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#27 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 02 July 2007 - 11:28 AM

Em có thư mục chứa thư viện nằm trong CD. Có cách nào khi load file lisp nằm trong thu mục này thì nó gán cho biến tenduongan là đường dẩn thư mục chứa file líp này không.
Ví dụ: đường dẩn file lisp như thế này E:\BV\DUY\DUONGAN.LSP
sau khi load lên thì thu được biến tenđuongan là E:\BV\DUY\
Bác nào biết chỉ giúp với.



Dùng hàm FINDFILE

(setq fpath (FINDFILE filename))

trong trường hợp của bạn thì có thể dùng là:

(setq fpath (FINDFILE "DUONGAN.LISP"))
  • 0

#28 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 02 July 2007 - 11:41 AM

Dùng hàm FINDFILE

(setq fpath (FINDFILE filename))

trong trường hợp của bạn thì có thể dùng là:

(setq fpath (FINDFILE "DUONGAN.LISP"))

Không được đâu!
vndesperados test lại đi!
hàm findfile chỉ tìm file trong các "AutoCAD library path" thôi.
  • 0

#29 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 02 July 2007 - 11:49 AM

Không được đâu!
vndesperados test lại đi!
hàm findfile chỉ tìm file trong các "AutoCAD library path" thôi.


Ừ nhỉ, quên mất, cảm ơn bác Hòanh
Nhưng mà cũng có thể dùng nếu trước đó đã được Add vào Support File Searh Path.
  • 0

#30 xuanhai

xuanhai

    biết vẽ line

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

Đã gửi 02 July 2007 - 01:30 PM

Cho mình xin hỏi lệnh (setvar "osmode" 33 ) có nghĩa là gì?
Cám ơn nhiều.
  • 0

#31 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 02 July 2007 - 01:40 PM

Ừ nhỉ, quên mất, cảm ơn bác Hòanh
Nhưng mà cũng có thể dùng nếu trước đó đã được Add vào Support File Searh Path.


Mục đích em hỏi đoạn lisp trên là để đưa thư mục đó vào Support File Searh Path mà.
Với lại còn phải cắt bớt đi một đoạn nửa.
Ý là có cách nào đọc được các thao tác khi chọn file và lưu thành chuổi hay không.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#32 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 02 July 2007 - 01:43 PM

Cho mình xin hỏi lệnh (setvar "osmode" 33 ) có nghĩa là gì?
Cám ơn nhiều.

Giá trị của osmode có nghĩa như sau:
0 NONe
1 ENDpoint
2 MIDpoint
4 CENter
8 NODe
16 QUAdrant
32 INTersection
64 INSertion
128 PERpendicular
256 TANgent
512 NEArest
1024 Clears all object snaps
2048 APParent Intersection
4096 EXTension
8192 PARallel

Như vậy, khi osmode bằng 33 = 32+1 tức là lệnh (setvar "osmode" 33) bật osnap ENDPoint và INTersection.
  • 2

#33 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 02 July 2007 - 01:44 PM

Cho mình xin hỏi lệnh (setvar "osmode" 33 ) có nghĩa là gì?
Cám ơn nhiều.


Nó chuyển chế độ tự động bắt điểm thành Enđpoin và Intersection (điểm đầu, điểm cuối và điểm giao nhau)
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#34 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 02 July 2007 - 02:54 PM

Mục đích em hỏi đoạn lisp trên là để đưa thư mục đó vào Support File Searh Path mà.
Với lại còn phải cắt bớt đi một đoạn nửa.
Ý là có cách nào đọc được các thao tác khi chọn file và lưu thành chuổi hay không.



Mình nghĩ là được và cách đó là ta không dùng lệnh APPLOAD mà ta dùng (LOAD LispFile)
Có nghĩa là ta sẽ viết một đọan LISP để thực hiện mục đích của mình
(DEFUN EXCUTE()
(setq fname (getfiled "Chon mot file LISP" "" "lsp" 8))
(if (/= fname Nil)
(progn
;;; code here
(princ fname)
)
)
(princ)
)
(DEFUN C:LF()
(EXCUTE)
)

  • 0

#35 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 02 July 2007 - 03:10 PM

Mình nghĩ là được và cách đó là ta không dùng lệnh APPLOAD mà ta dùng (LOAD LispFile)
Có nghĩa là ta sẽ viết một đọan LISP để thực hiện mục đích của mình

(DEFUN EXCUTE()
(setq fname (getfiled "Chon mot file LISP" "" "lsp" 8))
(if (/= fname Nil)
(progn
;;; code here
(princ fname)
)
)
(princ)
)
(DEFUN C:LF()
(EXCUTE)
)


Vẫn chưa đúng ý bác ạ. Em nói sơ tác dụng của lisp như thế này.
Em cho đĩa CD vào máy (hoặc thư mục có sẳn trong máy) Khi chọn load file này lên thì nó thực hiện coppy file, tạp đường dẩn đến thư mục chứa file lisp này. Nhửng bước sau thì em đã làm được rối nhưngcái phần lấy đường dẩn em phải khai thủ công bây giờ muốn tự động luôn.
Cái lisp trên cũng giải quyết được nhưng hơi vòng vèo. với lại còn đoạn cắt bỏ bớt tên file trong đường dẫn thì làm sao bác.
Cám ơn !
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#36 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 02 July 2007 - 04:15 PM

Vẫn chưa đúng ý bác ạ. Em nói sơ tác dụng của lisp như thế này.
Em cho đĩa CD vào máy (hoặc thư mục có sẳn trong máy) Khi chọn load file này lên thì nó thực hiện coppy file, tạp đường dẩn đến thư mục chứa file lisp này. Nhửng bước sau thì em đã làm được rối nhưngcái phần lấy đường dẩn em phải khai thủ công bây giờ muốn tự động luôn.
Cái lisp trên cũng giải quyết được nhưng hơi vòng vèo. với lại còn đoạn cắt bỏ bớt tên file trong đường dẫn thì làm sao bác.
Cám ơn !

Jin nghĩ cách như VnDesperados là đã đủ giải quyết vấn dề của đồng chí rồi.
Còn việc lấy trên đường dẫn thì sử dụng vòng lặp dò từng ký tự từ bên phải sang (bằng lệnh substr), khi nào thấy xuất hiện ký tự "\" thì cắt toàn bộ phần đuôi đi, thế là xong!

Theo Jin, một lisp như duy782006 muốn chuyên nghiệp hơn thì cần có thêm giao diện như sau:

Hình đã gửi

Nó bao gồm một danh sách các lisp đã chọn trước đó (được lưu vào file hệ thống), và command button cho phép chọn để load lisp mới.
Lisp này sử dụng cho trường hợp lisp bị dấu vào CD như duy782006 nói, chắc là bị vướng bản quyền :s_dead:
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#37 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 02 July 2007 - 04:50 PM

Jin nghĩ cách như VnDesperados là đã đủ giải quyết vấn dề của đồng chí rồi.
Còn việc lấy trên đường dẫn thì sử dụng vòng lặp dò từng ký tự từ bên phải sang (bằng lệnh substr), khi nào thấy xuất hiện ký tự "\" thì cắt toàn bộ phần đuôi đi, thế là xong!

Theo Jin, một lisp như duy782006 muốn chuyên nghiệp hơn thì cần có thêm giao diện như sau:

Hình đã gửi

Nó bao gồm một danh sách các lisp đã chọn trước đó (được lưu vào file hệ thống), và command button cho phép chọn để load lisp mới.
Lisp này sử dụng cho trường hợp lisp bị dấu vào CD như duy782006 nói, chắc là bị vướng bản quyền :s_dead:


Không phài là vấn đề bản quyền mà mình cí thư viện và 1 số lệnh lisp dùng quen rồi nếu đi máy khác thì không có mà dùng nên cho vào CD để đi máy nào củng làm viễc được nhưng không ảnh hưởng đến ACAD của máy khác. (cơ quan mình nhiều khi chạy lung tunh hết) .
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#38 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 02 July 2007 - 07:24 PM

Không phài là vấn đề bản quyền mà mình cí thư viện và 1 số lệnh lisp dùng quen rồi nếu đi máy khác thì không có mà dùng nên cho vào CD để đi máy nào củng làm viễc được nhưng không ảnh hưởng đến ACAD của máy khác. (cơ quan mình nhiều khi chạy lung tunh hết) .

Chà, vậy thì tiện quá rồi.
Sau khi mọi người bàn bạc như thế, đề nghị duy782006 tạo thành một lisp hoàn chỉnh rồi share cho mọi người với nha :s_dead:
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#39 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 03 July 2007 - 09:51 AM

Chà, vậy thì tiện quá rồi.
Sau khi mọi người bàn bạc như thế, đề nghị duy782006 tạo thành một lisp hoàn chỉnh rồi share cho mọi người với nha :s_dead:



Đang đọc sách chứ hồi giờ có biết hàm substr là gì đâu ????
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#40 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 05 July 2007 - 09:55 AM

Đang đọc sách chứ hồi giờ có biết hàm substr là gì đâu ????

Ở đầu topic này có nói về hàm ấy đấy. Hàm này cho phép truy xuất một chuỗi con trong một chuỗi mẹ, chẳng hạn lấy ra hai ký tự ab trong chuỗi dfabcd.
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com