Đế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

#241 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 19 March 2009 - 01:10 PM

Chào bạn Tue_NV
Ý của mình là cách viết lisp đó bạn.
Mình muốn mặc định Annotation type là None và Number of points là 2.

Bạn sử dụng qlset.lsp - Frank Whaley, Autodesk
với hàm (acet-ql-get )
trong trường hợp của bạn : Set Annotation type là None và Number of points là 2
tại dấu nhắc lệnh gõ : (acet-ql-set '((60 . 4)(67 . 2)))
Chúc thành công.
;;; qlset.lsp - example initialization of QLEADER settings
;;; Frank Whaley, Autodesk
;;;
;;; Two functions are included in this file:
;;;
;;; (acet-ql-Set)
;;; Returns an association list containing the current QLEADER settings from the
;;; Named Object Dictionary.
;;;
;;; (acet-ql-get )
;;; Sets the specified values for QLEADER settings from the given association
;;; list.
;;; Returns an association list containing the new values.
;;;
;;; These functions can be used to examine the current QLEADER settings, or to
;;; initialize the setting before using the QLEADER command.
;;; For example, to use splined leaders and framed text:
;;;
;;; (acet-ql-set '((65 . 1)(72 . 1)))
;;;
;;; Both functions use the following group codes to identify QLEADER settings:
;;;
;;; 3: user arrowhead block name (default="")
;;; 40: default text width (default=0.0)
;;; 60: annotation type (default=0)
;;; 0=MText
;;; 1=copy object
;;; 2=Tolerance
;;; 3=block
;;; 4=none
;;; 61: annotation reuse (default=0)
;;; 0=none
;;; 1=reuse next
;;; 62: left attachment point (default=1)
;;; 63: right attachment point (default=3)
;;; 0=Top of top line
;;; 1=Middle of top line
;;; 2=Middle of multiline text
;;; 3=Middle of bottom line
;;; 4=Bottom of bottom line
;;; 64: underline bottom line (default=0)
;;; 65: use splined leader line (default=0)
;;; 66: no limit on points (default=0)
;;; 67: maximum number of points (default=3)
;;; 68: prompt for MText width (word wrap) (default=1)
;;; 69: always left justify (default=0)
;;; 70: allowed angle, first segment (default=0)
;;; 71: allowed angle, second segment (default=0)
;;; 0=Any angle
;;; 1=Horizontal
;;; 2=90deg
;;; 3=45deg
;;; 4=30deg
;;; 5=15deg
;;; 72: frame text (default=0)
;;; 170: active tab (default=0)
;;; 0=Annotation
;;; 1=Leader Line & Arrow
;;; 2=Attachment
;;; 340: object ID for annotation reuse
;;;
;;; |;
acad-push-dbmod
(defun acet-ql-get (/ xr cod itm reply)
(if (setq xr (dictsearch (namedobjdict) "AcadDim"))
(progn
(foreach cod '(3 40 60 61 62 63 64 65 66 67 68 69 70 71 72 170 340)
(if (setq itm (assoc cod xr))
(setq reply (append reply (list itm)))))
reply)
'((3 . "")
(40 . 0.0)
(60 . 0)
(61 . 1)
(62 . 1)
(63 . 3)
(64 . 0)
(65 . 0)
(66 . 0)
(67 . 3)
(68 . 1)
(69 . 0)
(70 . 0)
(71 . 0)
(72 . 0)
(170 . 0))))

(defun acet-ql-set (arg / cur prm)
;; fetch current
(setq cur (acet-ql-get))

;; override per argument
(while arg
(setq prm (car arg)
arg (cdr arg)
cur (subst prm (assoc (car prm) cur) cur) )
;; handle DIMLDRBLK
(if (= 3 (car prm))
(setvar "DIMLDRBLK" (cdr prm))))

;; put back
(dictremove (namedobjdict) "AcadDim")
(setq cur (append '((0 . "XRECORD")(100 . "AcDbXrecord")(90 . 990106))
cur))
(dictadd (namedobjdict) "AcadDim" (entmakex cur))

(acet-ql-get))

;; load quietly
(princ)

  • 0

#242 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 19 March 2009 - 03:07 PM

Bạn sử dụng qlset.lsp - Frank Whaley, Autodesk
với hàm (acet-ql-get )
trong trường hợp của bạn : Set Annotation type là None và Number of points là 2
tại dấu nhắc lệnh gõ : (acet-ql-set '((60 . 4)(67 . 2)))
Chúc thành công.


Chào bác gia_bach
Cái thằng Qleader này phức tạp quá.
Em sẽ thử vận dụng liền vào cái lisp đang viết.
Cám ơn bác nhiều.
Chúc bác luôn vui vẻ, thành công.
  • 0

#243 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 26 March 2009 - 11:03 AM

Xin hỏi để sẻarch linetype center có tồn tại trong bản vẽ hay không thì dùng đoạn code dưới đây sai ở chổ nào

(defun c:test ()
(if (not (tblobjname "linetype" "center"))
(command "linetype" "l" "center" "" ""))
)
  • 0

#244 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 26 March 2009 - 01:19 PM

Xin hỏi để sẻarch linetype center có tồn tại trong bản vẽ hay không thì dùng đoạn code dưới đây sai ở chổ nào

(defun c:test ()
(if (not (tblobjname "linetype" "center"))
(command "linetype" "l" "center" "" ""))
)

Chào bạn tuan_thietkedien.
Để search LineType bạn dùng : (tblsearch "ltype" "center")
Và bạn xem lại cú pháp lệnh LineType nhé. Tại dấu nhắc lệnh gõ : -linetype
頑張って下さい。
  • 1

#245 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 26 March 2009 - 01:42 PM

Chào bạn tuan_thietkedien.
Để search LineType bạn dùng : (tblsearch "ltype" "center")
Và bạn xem lại cú pháp lệnh LineType nhé. Tại dấu nhắc lệnh gõ : -linetype
頑張って下さい。


Gia_bach様
何時もお世話になっております。
宜しくお願い致します。
:cry:
  • 1

#246 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 March 2009 - 02:14 PM

Gia_bach様
何時もお世話になっております。
宜しくお願い致します。
:cry:

Ối giời ới,
Mấy bác này chạy khiếp quá, sang tới Nhựt rồi đó, từ từ cho anh em theo với ới các bác ới.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#247 xuanvudk2

xuanvudk2

    biết pan

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

Đã gửi 03 April 2009 - 10:37 AM

Chào anh em đang tìm hiểu lập trình atolisp trong cad. Anh có tài liệu gì không gửi cho em xin
xuanvudk2@gmail.com
Cảm ơn anh nhiều
  • 0

#248 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 14 April 2009 - 09:11 AM

Chào mọi người.
Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.
Xin được giúp đỡ.

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))

(setq ss (ssget)
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)

Xin cám ơn.
  • 0

#249 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 April 2009 - 09:42 AM

Chào mọi người.
Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.
Xin được giúp đỡ.

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))

(setq ss (ssget)
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt) [color="#FF0000"](assoc 50 d)[/color] d)
i (1+ i)
)
(entmod d)
)
(princ)
)

Xin cám ơn.

Tại Lisp không hiểu ý của bạn đấy thôi.
Bạn định xoay đối tượng nào nhỉ
(assoc 50 d) . thì mã dxf 50 thuộc về đối tượng nào? Lisp không hiểu và mình cũng không hiểu nó thuộc về đối tượng nào.
Bạn nói rõ hơn nhé.
  • 1

#250 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 14 April 2009 - 10:24 AM

Chào mọi người.
Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.
Xin được giúp đỡ.
.............

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )
Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.
do đó bạn cần chuyển đổi từ độ -> radian
(defun deg->rad (f_ang)
(setq f_ang (* pi (/ f_ang 180.0)))
)

đây là LISP đã sửa đổi, hy vọng đúng ý bạn.
(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))
(setq rt1 (* pi (/ rt 180.0)))
(setq ss (ssget '((0 . "TEXT")))
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt1) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)

  • 1

#251 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 14 April 2009 - 01:28 PM

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )
Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.
do đó bạn cần chuyển đổi từ độ -> radian
(defun deg->rad (f_ang)
(setq f_ang (* pi (/ f_ang 180.0)))
)

đây là LISP đã sửa đổi, hy vọng đúng ý bạn.

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))
(setq rt1 (* pi (/ rt 180.0)))
(setq ss (ssget '((0 . "TEXT")))
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt1) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)


Chào bác gia_bach
Lisp bác sửa hoàn toàn đúng ý em, em đã sai lỗi cơ bản thế mà lại không biết.Hihi

@Bạn Tue_NV
Đúng như bác gia_bach nói, mình muốn xoay đối tượng là Text và Block trong bản vẽ.
Mình muốn dùng lisp này để xoay tất cả các đối tượng Text và Block mà không thay đổi điểm đặt của các đối tượng đó.

Cám ơn bác gia_bach và bạn Tue_NV đã quan tâm nha.
  • 0

#252 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 14 April 2009 - 02:18 PM

Chào bác gia_bach
Lisp bác sửa hoàn toàn đúng ý em, em đã sai lỗi cơ bản thế mà lại không biết.Hihi

@Bạn Tue_NV
Đúng như bác gia_bach nói, mình muốn xoay đối tượng là Text và Block trong bản vẽ.
Mình muốn dùng lisp này để xoay tất cả các đối tượng Text và Block mà không thay đổi điểm đặt của các đối tượng đó.

Cám ơn bác gia_bach và bạn Tue_NV đã quan tâm nha.

Chào bạn Tuan_thietkedien,
Bạn lưu ý trong lisp của bác Gia_bach, với một số trường hợp khi góc quay nằm trong khoảng pi/2 đến 3pi/2 , text sẽ bị lộn ngược đấy nhé.
Mặt khác trong lisp đó không đề cập tới các đối tượng là block như bạn nói. Với block thì việc quay block theo góc không có gì trở ngại lắm nhưng với text thì bạn cần lưu ý trường hợp text lộn ngược bạn nhé.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#253 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 14 April 2009 - 02:36 PM

Chào bạn Tuan_thietkedien,
Bạn lưu ý trong lisp của bác Gia_bach, với một số trường hợp khi góc quay nằm trong khoảng pi/2 đến 3pi/2 , text sẽ bị lộn ngược đấy nhé.
Mặt khác trong lisp đó không đề cập tới các đối tượng là block như bạn nói. Với block thì việc quay block theo góc không có gì trở ngại lắm nhưng với text thì bạn cần lưu ý trường hợp text lộn ngược bạn nhé.


Chào bạn phamthanhbinh
Thông thường mình chỉ xoay Text với góc 30 và 45 độ thôi, và để lisp chọn thêm đối tượng Block mình cũng thêm vào dòng ssget chữ Insert rồi.

Cám ơn bạn đã góp ý nha.
  • 0

#254 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 April 2009 - 02:41 PM

Chào bạn phamthanhbinh
Thông thường mình chỉ xoay Text với góc 30 và 45 độ thôi, và để lisp chọn thêm đối tượng Block mình cũng thêm vào dòng ssget chữ Insert rồi.

Cám ơn bạn đã góp ý nha.

Chào bạn TuanThietkedien
Việc xử lý Text không bị lộn ngược trong mọi trường hợp thì bạn có thể xem thêm trong bài viết này :
http://www.cadviet.c...o...205&st=1660
  • 1

#255 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 17 April 2009 - 04:42 PM

Mình có cái này muốn hỏi. Khi làm việc với Block và lấy cơ sở dữ liệu của Block Dynamic thì thấy tên Block mã DXF là 2 bị biến đổi đi không còn đúng như tên Block ở Edit block nữa. Chính vì vậy việc Lisp lưu tên Block để sau chọn nhóm Block là ...vô ích.
Ví dụ. Tên block là "ranhgach" nhưng khi lấy mã DXF thì nó ra là (2 . "*U3") . Mọi người có biết quy luật đặt tên của Dynamic Block này không ?
  • 0

#256 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 17 April 2009 - 05:23 PM

Mình có cái này muốn hỏi. Khi làm việc với Block và lấy cơ sở dữ liệu của Block Dynamic thì thấy tên Block mã DXF là 2 bị biến đổi đi không còn đúng như tên Block ở Edit block nữa. Chính vì vậy việc Lisp lưu tên Block để sau chọn nhóm Block là ...vô ích.
Ví dụ. Tên block là "ranhgach" nhưng khi lấy mã DXF thì nó ra là (2 . "*U3") . Mọi người có biết quy luật đặt tên của Dynamic Block này không ?

Sau một lúc tìm tòi thì phát hiện ra cái này. Tên Dynamic Block không thể lấy được theo cách thông thường mà phải lấy bằng một trong 2 cách sau:
+ Cách 1:

(vl-load-com)
(setq tenblock (vla-get-EffectiveName
(vlax-ename->vla-object
(car (entsel "\nSelect block: "))
)
)
)


+ Cách 2:

(and
(assoc 360
(setq ed
(entget
(ssname
(ssget "_:E:S" '((0 . "INSERT")))
0
)
)
)
) ;_ {setq
(repeat 3
(setq ed
(entget (cdr (assoc 360 ed)))
) ;_ {setq
) ;_ {repeat
(setq ed (entget (cdr (assoc 340 ed))))
) ;_ {and
(setq tenblock (cdr (assoc 2 ed)))

  • 0

#257 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 27 April 2009 - 03:23 PM

Mình thấy trên diễn đàn các bạn hay dùng hàm tìm giao điểm hai đối tượng như thế này : (vla-IntersectWith ob1 ob2 acExtendNone), nhưng chỉ với đối tượng 2D. Còn đối tượng 3D có cao độ bất kỳ thỉ dùng như thế nào, có tìm đc giao điểm không? Có thể tìm đc giao điểm của chúng trên mặt phẳng XY mà không làm thay đổi dữ liệu của chúng đc kg? Bạn nào biết, xin chỉ giúp. Cám ơn
  • 0

#258 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 27 April 2009 - 03:42 PM

Mình thấy trên diễn đàn các bạn hay dùng hàm tìm giao điểm hai đối tượng như thế này : (vla-IntersectWith ob1 ob2 acExtendNone), nhưng chỉ với đối tượng 2D. Còn đối tượng 3D có cao độ bất kỳ thỉ dùng như thế nào, có tìm đc giao điểm không? Có thể tìm đc giao điểm của chúng trên mặt phẳng XY mà không làm thay đổi dữ liệu của chúng đc kg? Bạn nào biết, xin chỉ giúp. Cám ơn

Theo mình thì hàm này vẫn đúng với đối tượng 3D. Còn nếu chỉ tim giao điểm trên mặt phẳng XY thì bạn dùng mẹo thử xem: cho tất cả đối tượng cần lấy giao về 1 mặt phằng (lệnh flaten j đó) rồi lấy giao điểm sau đó lại undo đối tượng lại, chỉ lấy mỗi list giao điểm thôi (dùng Undo mark và Undo back)
  • 2

#259 xuangiangtedi

xuangiangtedi

    biết vẽ line

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

Đã gửi 29 April 2009 - 08:09 AM

Cac bạn cho minh hỏi file có dạng *.fas trong autocad có thuộc loại phai lsp không? có cách nào để đọc và chỉnh sủa file đó không? Cách tạo ra file dó nhw thế nào? Rất mong được các bạn chỉ giúp cang nhanh càng tốt. Cảm ơn rất nhiều
  • 0

#260 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 07 May 2009 - 03:59 PM

Cho Tú hỏi chút:
-khi viết lisp mình dùng biến nào để khi nhập 2 điểm thì nó xuất hiện 1 nét hỗ trợ vậy.
- VD: (setq PT1 (getpoint "\n chon diêm 1:")
PT2 (getpoint "\n chon diem 2:")
)
Trong cad khi chọn từ điểm 1 đến điểm 2 có 1 nét hỗ trợ. Xin cám ơn
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.