Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
limfx

Lisp entmake Arc length Dimension

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

Mình đang tạo Lisp entmake Arc length Dimension, làm thế nào để xác định điểm p3, p4 từ điểm p1, p2 đã biết để cho kết quả Arc length Dimension như mong muốn? Thanks!

Lisp:

(entmakex (list '(0 . "ARC_DIMENSION") '(100 . "AcDbEntity")
        (cons 100 "AcDbDimension")
        (cons 10 p3);location of dimension line
        (cons 11 p4);location of dimension text
        (cons 70 37)
        (cons 100 "AcDbArcDimension")
        (cons 13 p1);start point
        (cons 14 p2);end mpoint
        (cons 15 c);center point
      );list
      );entmake

Dimention.dwg

dimmension.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
56 phút trước, limfx đã nói:

Mình đang tạo Lisp entmake Arc length Dimension, làm thế nào để xác định điểm p3, p4 từ điểm p1, p2 đã biết để cho kết quả Arc length Dimension như mong muốn? Thanks!

Lisp:

(entmakex (list '(0 . "ARC_DIMENSION") '(100 . "AcDbEntity")
        (cons 100 "AcDbDimension")
        (cons 10 p3);location of dimension line
        (cons 11 p4);location of dimension text
        (cons 70 37)
        (cons 100 "AcDbArcDimension")
        (cons 13 p1);start point
        (cons 14 p2);end mpoint
        (cons 15 c);center point
      );list
      );entmake

Dimention.dwg

dimmension.jpg

Cái Point P1 P2 đi theo chiều cố định theo chiều ngược chiều kim đồng hồ bạn nhé

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

1. Nếu bạn chỉ đơn giản là Dim arc thì học theo bác @Doan Nguyen Van 

2. Nếu bạn đang định viết chương trình Dim theo polyline nên P1 P2 không theo quy luật thì tham khảo thêm về Bulge Polyline hoặc Bulge arc để rõ cái này hơn.

  • Like 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
8 phút trước, tannguyen291 đã nói:

1. Nếu bạn chỉ đơn giản là Dim arc thì học theo bác @Doan Nguyen Van 

2. Nếu bạn đang định viết chương trình Dim theo polyline nên P1 P2 không theo quy luật thì tham khảo thêm về Bulge Polyline hoặc Bulge arc để rõ cái này hơn.

Cảm ơn bác đã chỉ đường. Bulge Polyline được ứng dụng vào nhiều thứ!

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

Mình cũng có 1 lisp dim all polyline giống như bạn. dim cả cạnh arc.

Explode ra đơn giản hiệu quả hơn. 

Dùng cái này

(setq lst_edge (vlax-invoke obj 'Explode))

foreach item in lst_edge

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

Mình cũng k rõ bạn muốn nghiên cứu về phần gì

Theo mình nghĩ ActiveX của autolisp chính là các tập lệnh thuộc (VL-LOAD-COM) 

MÌnh hay tìm hiểu trên www.afralisp.net hoặc ở đây cũng được 

http://docs.autodesk.com/ACD/2011/CHS/filesALR/WSfacf1429558a55de1a7524c1004e616f8b-5913.htm

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

Phương thức AddDimArc Method:

RetVal = object.AddDimArc(ArcCenter, FirstEndPoint, SecondEndPoint, ArcPoint)

Mình test thử:

(defun c:test()
(vl-load-com)
(setq arc (car (entsel)))
(setq arcobj (vlax-ename->vla-object arc))
(setq sp (vlax-curve-getstartpoint arcobj))
(setq ep (vlax-curve-getendpoint arcobj))
(setq cpt (vlax-get arcobj 'Center))
(setq p3 (getpoint cpt))
(vlax-invoke arcobj 'AddDimArc cpt sp ep p3)
);end

Xuất hiện lỗi: error: ActiveX Server returned the error: unknown name: "ADDDIMARC"?

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
15 phút trước, limfx đã nói:

Phương thức AddDimArc Method:

RetVal = object.AddDimArc(ArcCenter, FirstEndPoint, SecondEndPoint, ArcPoint)

Mình test thử:

(defun c:test()
(vl-load-com)
(setq arc (car (entsel)))
(setq arcobj (vlax-ename->vla-object arc))
(setq sp (vlax-curve-getstartpoint arcobj))
(setq ep (vlax-curve-getendpoint arcobj))
(setq cpt (vlax-get arcobj 'Center))
(setq p3 (getpoint cpt))
(vlax-invoke arcobj 'AddDimArc cpt sp ep p3)
);end

Xuất hiện lỗi: error: ActiveX Server returned the error: unknown name: "ADDDIMARC"?

Bạn dùng thử lisp này:

(defun c:dima (/ doc spc ss cnt ent el spt ept mpt)
  (setq doc (vla-get-activedocument (vlax-get-acad-object))
        spc (vlax-get-property doc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace))
  )
  (princ "\nSelect line-arc ")  
  (if (setq ss (ssget "_:L" '((0 . "LINE,ARC"))))
          (repeat (setq cnt (sslength ss))
            (setq ent (ssname ss (setq cnt (1- cnt)))
                  el (entget ent)
                  spt (vlax-curve-getstartpoint ent)
                  ept (vlax-curve-getendpoint ent)
                  mpt (vlax-curve-getpointatdist ent (/ (vlax-curve-getdistatpoint ent ept) 2.0))
            );end_setq
            (cond ( (= (cdr (assoc 0 el)) "LINE") (vlax-invoke spc 'adddimaligned spt ept mpt))
                  ( (= (cdr (assoc 0 el)) "ARC") (vlax-invoke spc 'adddimarc (cdr (assoc 10 el)) spt ept mpt))
            );end_cond
            
          );end_repeat
        )
  (princ )
)

 

  • Like 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
17 giờ trước, tannguyen291 đã nói:

Mình cũng k rõ bạn muốn nghiên cứu về phần gì

Theo mình nghĩ ActiveX của autolisp chính là các tập lệnh thuộc (VL-LOAD-COM) 

MÌnh hay tìm hiểu trên www.afralisp.net hoặc ở đây cũng được 

http://docs.autodesk.com/ACD/2011/CHS/filesALR/WSfacf1429558a55de1a7524c1004e616f8b-5913.htm

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
9 phút trước, gia_bach đã nói:

Bạn dùng thử lisp này:


(defun c:dima (/ doc spc ss cnt ent el spt ept mpt)
  (setq doc (vla-get-activedocument (vlax-get-acad-object))
        spc (vlax-get-property doc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace))
  )
  (princ "\nSelect line-arc ")  
  (if (setq ss (ssget "_:L" '((0 . "LINE,ARC"))))
          (repeat (setq cnt (sslength ss))
            (setq ent (ssname ss (setq cnt (1- cnt)))
                  el (entget ent)
                  spt (vlax-curve-getstartpoint ent)
                  ept (vlax-curve-getendpoint ent)
                  mpt (vlax-curve-getpointatdist ent (/ (vlax-curve-getdistatpoint ent ept) 2.0))
            );end_setq
            (cond ( (= (cdr (assoc 0 el)) "LINE") (vlax-invoke spc 'adddimaligned spt ept mpt))
                  ( (= (cdr (assoc 0 el)) "ARC") (vlax-invoke spc 'adddimarc (cdr (assoc 10 el)) spt ept mpt))
            );end_cond
            
          );end_repeat
        )
  (princ )
)

 

Thanks! Lisp rất hay. Mình đã khắc phục được  error từ modelspace.

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
12 phút trước, gia_bach đã nói:

(vlax-invoke arcobj 'AddDimArc cpt sp ep p3)

sai của bạn ở đây nè. 

bạn dùng lệnh như thế này nhé

(vla-AddDimArc modelspace ArcCenter FirstEndPoint SecondEndPoint ArcPoint)

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
10 phút trước, tannguyen291 đã nói:

sai của bạn ở đây nè. 

bạn dùng lệnh như thế này nhé

(vla-AddDimArc modelspace ArcCenter FirstEndPoint SecondEndPoint ArcPoint)

Thanks! Mình đã học được nhiều thứ !

Khi thực hiện (setq lst_edge (vlax-invoke obj 'Explode)) thì lisp tạo ra các phân đoạn chồng lên pline cũ. Vậy làm cách nào để xóa nó đi khi kết thúc lisp?

 

 

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

Hình như bạn đang học Autolisp thì phải. Có rất nhiều cách để xoá đối tượng.

Xoá bằng command: (command "erase" ename "")

Xoá bằng lisp: (entdel ename)

Xoá bằng activex: (vla-delete obj)

với 1 danh sách như trên thì có thể dùng foreach hoặc mapcar

Mình sẽ dùng (mapcar 'vla-delete lst_edge)

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

Mình mới tiếp cận lisp. Kiến thức mảng này nhiều và khó. Không biết làm cách nào để tiếp cận nhanh đượ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 mới học thì thử tải visual studio code về dùng thay cho vlide của cad. ở đó có đề xuất câu lệnh. dùng đỡ tốn thời gian hơn đấy.  

image.png.ae02873e7a2c61334193ee8ce72e8d2b.png

mình cũng từ đây biết được rất nhiều lệnh hay ít được sử dụng.

có hướng dẫn cụ thể luôn

image.png.f9fb65aa2470d8245431b6395f9474fe.png

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

Lâu nay mình dùng studio code cho Python,  không biết nó hỗ trợ viết lisp, để mình vọc thử xem sao! Thanks!

stodio.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
Vào lúc 12/1/2023 tại 10:49, tannguyen291 đã nói:

Bạn mới học thì thử tải visual studio code về dùng thay cho vlide của cad. ở đó có đề xuất câu lệnh. dùng đỡ tốn thời gian hơn đấy.  

image.png.ae02873e7a2c61334193ee8ce72e8d2b.png

mình cũng từ đây biết được rất nhiều lệnh hay ít được sử dụng.

có hướng dẫn cụ thể luôn

image.png.f9fb65aa2470d8245431b6395f9474fe.png

Bạn install Extension nào mà được chú thích hàm chi tiết vậy?

extention.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
1 giờ} trướ}c, tannguyen291 đã nói:

bạn tìm cái này nhé. 

image.png.f494b9255ee0e0647c8357b1b249c740.png

Ngoài ra vào cad: chuyển variable lispsys thành 1. sẽ có chức năng debug rất hay nữa.thay thế cho vlide luôn.

Làm sao được các dòng chú thích nhắc lệnh?

 

extention1.jpg

extention2.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
23 giờ trước, tannguyen291 đã nói:

Cái này do may rủi. kk bạn phải dùng nhiều nó mới hiện ra. haha

thế hóa ra nó chơi khăm rồi. Dùng nhiều thì thuộc cách viết rồi cần gì nó gợi ý nữa

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ạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×