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

#1021 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 16 December 2011 - 09:51 AM

sorry bác Hà. Do ko đọc bài gốc của bác nên tưởng bác muốn chỉnh sửa text của Dim.
Còn nếu chỉ để lấy text của dim thì chỉ cần lấy giá trị dxf 1 của thằng Mtext (đối tượng con của dim) rồi bỏ đi 5 ký tự đầu đi là được. sao phải lằng nhằng gì nữa nhỉ? Như mình nói ở trên. giá trị dxf 1 của đối tượng Mtext luôn theo giá trị dxf 1 của dim
  • 0

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


#1022 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 16 December 2011 - 10:03 AM

Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!
P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.
............

Chỉ cần EntMod lại đối tượng là có thể lấy dxf1 và dxf 42.
code : (entmod (entget (car(entsel "Chon d/tuong :"))))

hoặc tổng quát hơn cho tập chọn (fix cả lỗi giãn TEXT của quochuyksxd )

(defun C:fix()
(foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget )))));(list (cons 0 "DIMENSION,TEXT")))))))
(entmod e) ) )

  • 1

#1023 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 December 2011 - 10:22 AM

Thank bác Gia Bach + Ketxu. Cách của bác Gia Bach hay quá. Hóa ra chỉ cần entmod là đượ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.


#1024 damvinhduy

damvinhduy

    biết vẽ line

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

Đã gửi 16 December 2011 - 01:09 PM

Có một số lisp khi load vào sử dụng thì báo lỗi: ActiveX Server returned an error: Error loading type library/DLL. Không biết đó là lỗi gì, các bạn nào biết chỉ giúp cách khắc phục. Thanks.

Không ai có thể giúp mình câu hỏi này sao?
  • 0

#1025 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 December 2011 - 01:57 PM

Không ai có thể giúp mình câu hỏi này sao?


Xem trang này xem sao, có lỗi đúng như bạn nói.
http://www.experts-e...Q_22157723.html
  • 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.


#1026 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 December 2011 - 02:29 PM

Thank bác Gia Bach + Ketxu. Cách của bác Gia Bach hay quá. Hóa ra chỉ cần entmod là được.

vla-update của e hoặc entupd của bác Thái chính là thể hiện điều đó

Không ai có thể giúp mình câu hỏi này sao?

Bạn nên đưa toàn lisp lên thì mọi người có cái nhìn tổng quan hơn
  • 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


#1027 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 22 December 2011 - 10:39 AM

Các bác giúp mình với:
- Mình có vla-object name của đối tượng block insert chứa một số attribute, tag là "a" "b" "c"... chẳng hạn.
giờ mình muốn lấy vla-object name của thằng ku "a" thì làm thế nào? mình ngại chuyển về ename nên không muốn dùng cách này.

- mở rộng hơn, mình có ActiveSelectionSet là tập hợp của các block trên:
(ssget '((0 . "INSERT")))
(vla-get-ActiveSelectionSet *document*)
giờ mình muốn có code ngắn nhất để lấy được danh sách (list) vla-object của tất cả đối tượng con có tag là "a"
  • 0

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


#1028 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 22 December 2011 - 10:59 AM

Các bác giúp mình với:
- Mình có vla-object name của đối tượng block insert chứa một số attribute, tag là "a" "b" "c"... chẳng hạn.
giờ mình muốn lấy vla-object name của thằng ku "a" thì làm thế nào? mình ngại chuyển về ename nên không muốn dùng cách này.

- mở rộng hơn, mình có ActiveSelectionSet là tập hợp của các block trên:
(ssget '((0 . "INSERT")))
(vla-get-ActiveSelectionSet *document*)
giờ mình muốn có code ngắn nhất để lấy được danh sách (list) vla-object của tất cả đối tượng con có tag là "a"

Bác tham khảo cái này xem:

; VxGetAtts - Reads all attribute values from a block
; Copyright: ©2000 MENZI ENGINEERING GmbH, Switzerland
; Arguments [Type]:
; Obj = Object [VLA-OBJECT]
; Return [Type]:
; > Dotted pair list '(("Tag1" . "Val1")...) [LIST]
; Notes:
; - None
(defun VxGetAtts (Obj)
(mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att))) (vlax-invoke Obj 'GetAttributes)))

  • 1

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


#1029 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 22 December 2011 - 11:08 AM

Các bác giúp mình với:
- Mình có vla-object name của đối tượng block insert chứa một số attribute, tag là "a" "b" "c"... chẳng hạn.
giờ mình muốn lấy vla-object name của thằng ku "a" thì làm thế nào? mình ngại chuyển về ename nên không muốn dùng cách này.

- mở rộng hơn, mình có ActiveSelectionSet là tập hợp của các block trên:
(ssget '((0 . "INSERT")))
(vla-get-ActiveSelectionSet *document*)
giờ mình muốn có code ngắn nhất để lấy được danh sách (list) vla-object của tất cả đối tượng con có tag là "a"

Thaistreetz tham khảo Lisp này (đổi nội dung biến tag theo nhu cầu):

(defun c:exTag (/ attlst e i obj reslst ss tag tagname)
(vl-load-com)
(if (setq ss (ssget (list (cons 0 "INSERT")(cons 66 1))))
(progn
(setq i -1 tag "a") ; doi ten tag
(while (setq e (ssname ss (setq i (1+ i))))
(setq obj (vlax-Ename->Vla-Object e)
attLst (vlax-invoke obj 'GetAttributes))
(foreach att attLst
(setq tagName (vla-get-TagString att))
(if (= tagName tag)
(setq resLst (cons att resLst)) )) );(vla-get-TextString att)
(princ (vl-princ-to-string resLst)) ))
(princ))

hay

(defun c:exTag1 (/ reslst tag )
(vl-load-com)
(if (ssget(list (cons 0 "INSERT")(cons 66 1)))
(progn
(setq tag "a") ; doi ten tag
(vlax-for obj (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-Acad-Object)))
(foreach att (vlax-invoke obj 'GetAttributes)
(if (= (vla-get-TagString att) tag)
(setq resLst (cons att resLst)) )));(vla-get-TextString att)
(princ (vl-princ-to-string resLst)) ) )
(princ))

  • 1

#1030 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 22 December 2011 - 11:39 AM

hix. các bác hiểu ngược ý của mình rồi.
trong ví dụ của bác Hà và bác Gia Bách thì từ object ta lấy ra giá trị của đối tượng.
còn nhu cầu của mình là ngược lại:
mình có vla-object của đối tượng chính là block. block đó chứa các đối tượng att. từ tag của att mình muốn lấy vla-object của chính nó thôi (mục đích để xử lý cho các bước tiếp theo ấy mà)
1 cách tương đương thì mình có ename của 1 đối tượng block insert. và mình muốn lấy ename của đối tượng con của nó có tag "a". nhưng vì đang xử lý trên vla-object nên không muốn chuyển về ename, cho đỡ lằng nhằng ý mà.
  • 0

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


#1031 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 December 2011 - 11:50 AM

Cái VD 2 của bác gia_bach là đúng ý bác Thái r chứ nhỉ :o

(vl-remove-if-not '(lambda(x)(eq (vla-get-TagString x) Tag)) (vlax-invoke blockObj 'GetAttributes) )


  • 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


#1032 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 22 December 2011 - 12:13 PM

Cảm ơn các bác. đúng là 1 lúc ngâm cứu code của bác Gia Bách thì thấy chuẩn luôn rồi. mình hồ đồ quá :P
(defun c:fg (/ lst)
(ssget '((0 . "INSERT")))
(setq tag "a")
(vlax-for Obj (vla-get-ActiveSelectionSet *document*)
(setq lst (append (vlax-invoke obj 'GetAttributes) lst)))
(vl-remove-if-not '(lambda (x) (and x (= tag (vla-get-TagString x)))) lst))

Mình có 1 chút thắc mắc nữa chưa tìm được lời giải:
mới đầu mình dùng code này để lấy list att : (vlax-safearray->list (vlax-variant-value (vla-getattributes obj)))
tuy nhiên nó không khả thi vì lúc thì nó lấy được, lúc thì nó báo lỗi tại hàm vlax-variant-value, nội dung như thế này:
error: ActiveX Server returned an error: Invalid index
thế là sao nhỉ?
  • 0

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


#1033 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 December 2011 - 12:29 PM

(vla-getattributes obj) trả về Nil
  • 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


#1034 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 23 December 2011 - 12:58 PM

Cảm ơn các bác. đúng là 1 lúc ngâm cứu code của bác Gia Bách thì thấy chuẩn luôn rồi. mình hồ đồ quá :P

(defun c:fg (/ lst)
(ssget '((0 . "INSERT")))
(setq tag "a")
(vlax-for Obj (vla-get-ActiveSelectionSet *document*)
(setq lst (append (vlax-invoke obj 'GetAttributes) lst)))
(vl-remove-if-not '(lambda (x) (and x (= tag (vla-get-TagString x)))) lst))

Mình có 1 chút thắc mắc nữa chưa tìm được lời giải:
mới đầu mình dùng code này để lấy list att : (vlax-safearray->list (vlax-variant-value (vla-getattributes obj)))
tuy nhiên nó không khả thi vì lúc thì nó lấy được, lúc thì nó báo lỗi tại hàm vlax-variant-value, nội dung như thế này:
error: ActiveX Server returned an error: Invalid index
thế là sao nhỉ?

Do đối tuợng không phải là Block thuộc tính.
Cách khắc phục :
- kiểm tra block có thuộc tính hay không : (eq :vlax-true (vla-get-hasAttributes obj))
- hoặc lọc ngay từ ssget : (ssget(list (cons 0 "INSERT")(cons 66 1)))
  • 2

#1035 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 26 December 2011 - 12:18 AM

mình có 1 Safearray chứ dữ liệu 3D point. làm thế nào để chuyển nó thành 2D mà không cần chuyển nó về list để xử lý? kết quả không có phần tử thứ 3 (không có tọa độ z) chứ không fải là giá trị của phần tử thứ 3 = 0 (tọa độ z = 0) nhé.
  • 0

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


#1036 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 December 2011 - 09:12 AM

mình có 1 Safearray chứ dữ liệu 3D point. làm thế nào để chuyển nó thành 2D mà không cần chuyển nó về list để xử lý? kết quả không có phần tử thứ 3 (không có tọa độ z) chứ không fải là giá trị của phần tử thứ 3 = 0 (tọa độ z = 0) nhé.

Ngoài cách chuyển về List để xử lý thì theo Tue_NV biết thì không có cách nào khác nữa đâu bạn.
  • 1

#1037 hochoaivandot

hochoaivandot

    biết dimradius

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

Đã gửi 28 December 2011 - 05:14 PM

Em viết code sau để lấy danh sách Block name.
Nhưng kết quả ("*Model_Space" "*Paper_Space" "*Paper_Space0" "Block1" "Block2" "Block3")
Mình không muốn mấy cái Block động và "*Model_Space" "*Paper_Space" "*Paper_Space0" tham gia vào danh sách trả về.
Mọi người giúp với. Phải vl-remove-if thế nào nhỉ???

(defun GetListBlock(/ acadobject acaddocument for-item lst obj_block)
(setq acadobject (vlax-get-Acad-Object))
(setq acaddocument (vla-get-activedocument acadobject))
(setq obj_block (vla-get-blocks acaddocument))
(setq lst (list))
(vlax-for for-item obj_block
(setq lst (cons (vla-get-Name for-item) lst))
)
(reverse lst)
)

File đính kém nếu cần: http://www.cadviet.c...40108_block.dwg
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#1038 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 December 2011 - 05:19 PM

Bỏ những cái có `* đằng trước bác ạ :)
  • 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


#1039 hochoaivandot

hochoaivandot

    biết dimradius

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

Đã gửi 29 December 2011 - 09:17 AM

Bỏ những cái có `* đằng trước bác ạ

Làm được rồi. Cảm ơn ketxu nhé

(defun GetListBlock(/ acadobject acaddocument for-item lst obj_block)
(setq acadobject (vlax-get-Acad-Object))
(setq acaddocument (vla-get-activedocument acadobject))
(setq obj_block (vla-get-blocks acaddocument))
(setq lst (list))
(vlax-for for-item obj_block
(if (/= (substr (setq #name (vla-get-Name for-item)) 1 1) "*")
(setq lst (cons #name lst))
)
)
(reverse lst)
)

  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#1040 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 January 2012 - 06:41 PM

Tôi sử dụng lisp dưới đây để tính góc của tiếp tuyến với curve tại điểm giữa của curve, nhưng trong file cad đính kèm thì nó bị lỗi (đường màu xanh). Tôi biết lỗi ở hàm (vlax-curve-getParamAtPoint obj cen) nhưng không hiểu vì sao mà lỗi, và cách khắc phục. Ai biết xin chỉ giùm.
http://www.cadviet.c...29_loi_vlax.dwg

(defun C:HA( / obj len cen goc)
(setq obj (vlax-ename->vla-object (car (entsel))))
(setq len (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))
(setq cen (vlax-curve-getPointAtDist obj (/ len 2)))
(setq goc (angle '(0 0 0) (vlax-curve-getFirstDeriv obj (vlax-curve-getParamAtPoint obj cen)))))

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