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

DIMORDINATE CHO ĐƯỜNG TRÒN

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

18 giờ trước, vietnam1 đã nói:

CHÀO CÁC BÁC TRONG DIỄN ĐÀN, BÁC NÀO CÓ LISP NÀO GHI ĐƯỢC KÍCH THƯỚC CHO ĐƯỜNG TRÒN KIỂU NÀY KHÔNG Ạ?

 

image.png

Nhìn hình vẽ rất rối, bạn có thể tinh giản lại hình ảnh hoặc 1 file dwg nhỏ thôi, trước và sau khi dùng lisp . Có thể tôi hay ai đó trên diễn đàn này giúp bạn.

  • Vote tăng 1
  • Vote giảm 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

http://adaucogit.blogspot.com/2010/09/automatic-ordinate-dimensioning.html#more

Dim giống trong bài này ở dòng số 7 bác ah. dim từ cạnh của đường tròn chứ không phải từ tâm của đường tròn. Em thấy nhiều lisp dim từ tâm của đường tròn ra. Còn lisp từ cạnh của đường tròn lại không có.

test dimordinate.dwg

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

DIMORDINATE là dim cho tọa độ X, Y của 1 điểm bất kỳ, nó không liên quan gì đến đường tròn. 

Vậy bạn cần là đặt lại chế độ bắt điểm cho phù hợp vào node 1/4 đường tròn là đượ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
11 giờ trước, vietnam1 đã nói:

http://adaucogit.blogspot.com/2010/09/automatic-ordinate-dimensioning.html#more

Dim giống trong bài này ở dòng số 7 bác ah. dim từ cạnh của đường tròn chứ không phải từ tâm của đường tròn. Em thấy nhiều lisp dim từ tâm của đường tròn ra. Còn lisp từ cạnh của đường tròn lại không có.

test dimordinate.dwg

Trong bản vẽ test dimordinate.dwg này, không thấy toạ độ tâm đường tròn được dim_ordinate. Bạn phải nói rõ hơn về các dim màu cyan được tạo như trong hình, bắt điểm từ đâu để tạo dim_ordinate?

 

image.png

  • Vote tăng 1
  • Vote giảm 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
11 phút trước, cuongtk2 đã nói:

DIMORDINATE là dim cho tọa độ X, Y của 1 điểm bất kỳ, nó không liên quan gì đến đường tròn. 

Vậy bạn cần là đặt lại chế độ bắt điểm cho phù hợp vào node 1/4 đường tròn là được.

Ở bản vẽ này, bắt điểm Quadrant để tạo dim_ordinate cũng không đúng. Thiệp vừa tạo dim_ordinate  (màu vàng) nó khác xa với dim_ordinate màu cyan trong bản vẽ?

image.png.d90f1b67eea38a7be84f53d2eba23def.png

  • Vote tăng 1
  • Vote giảm 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

 

Vào lúc 22/10/2021 tại 15:42, thiep đã nói:

Nhìn hình vẽ rất rối, bạn có thể tinh giản lại hình ảnh hoặc 1 file dwg nhỏ thôi, trước và sau khi dùng lisp . Có thể tôi hay ai đó trên diễn đàn này giúp bạn.

Ba ngày sau chủ thớt mới trả lời, chắc đợi ba ngày nữa quá.

  • Vote giảm 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

Dim dưới và phải.

(defun c:test ( / CENT ENT P1 P1A P2 P2A RAD)
(setq ent (entget (car (entsel))))
(setq cent (acet-dxf 10 ent)
      rad (acet-dxf 40 ent)
      p1 (polar cent 0 rad)
      p1a (polar cent 0 ( * rad 1.2))
      p2 (polar cent (* pi 1.5) rad)
      p2a (polar cent (* pi 1.5) ( * rad 1.2))
      )
(command "dimordinate" p1 p1a)
(command "dimordinate" p2 p2a)
)

 

  • Vote tăng 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 giờ trước, cuongtk2 đã nói:

Dim dưới và phải.


(defun c:test ( / CENT ENT P1 P1A P2 P2A RAD)
(setq ent (entget (car (entsel))))
(setq cent (acet-dxf 10 ent)
      rad (acet-dxf 40 ent)
      p1 (polar cent 0 rad)
      p1a (polar cent 0 ( * rad 1.2))
      p2 (polar cent (* pi 1.5) rad)
      p2a (polar cent (* pi 1.5) ( * rad 1.2))
      )
(command "dimordinate" p1 p1a)
(command "dimordinate" p2 p2a)
)

 

@cuongtk2Thiệp đã viết lisp, nhưng không dùng hàm "command" chỉ dùng hàm entmake, và đang rắc rối 1 chút về UCS và WCS, nhưng có thể gỡ lỗi được. 1 ý nữa là chỉ cần pick chọn đường tròn, từ điểm pick, lisp hiểu sẽ tạo 2 dimordinate ở 2 điểm quadrant nào, không nên cứng nhắc chỉ là tạo 2 dimordinate dưới và phải.

  • Like 1
  • Vote giảm 2

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 27/10/2021 tại 11:38, thiep đã nói:

@cuongtk2Thiệp đã viết lisp, nhưng không dùng hàm "command" chỉ dùng hàm entmake, và đang rắc rối 1 chút về UCS và WCS, nhưng có thể gỡ lỗi được. 1 ý nữa là chỉ cần pick chọn đường tròn, từ điểm pick, lisp hiểu sẽ tạo 2 dimordinate ở 2 điểm quadrant nào, không nên cứng nhắc chỉ là tạo 2 dimordinate dưới và phải.

Bác gỡ lỗi xong chưa mà không thấy đưa code lên? Còn pick chọn circle thì nên quét chọn rồi suy ra điểm cần lấy toạ độ thì hay hơn là pick từng circle một. Hy vọng bác làm xong và đưa lên cho mọi người tham khảo.

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

Bác gỡ lỗi xong chưa mà không thấy đưa code lên? Còn pick chọn circle thì nên quét chọn rồi suy ra điểm cần lấy toạ độ thì hay hơn là pick từng circle một. Hy vọng bác làm xong và đưa lên cho mọi người tham khảo.

Ui, cơm áo gạo tiền, nó thúc mông chạy trối chết. Lisp đã fix xong, đang chạy rô đa,

Cái điều "quét chọn" các circle như @alisp nói mình cũng muốn lắm, nhưng nó liên quan đến thuật toán "chật chội", mà viết thuật toán này lâu lắm. Mục đích là để lisp hiểu chỗ nào chật chội th ì không tạo dimordinate, tìm chỗ rộng để tạo dimordinate. Như hình dưới đây thì tìm chỗ rộng, và bẻ khúc dim nữa thì thật khó chịu.

 

image.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ệnh po0: tạo điểm quy chiếu, (giống như dời điểm gốc hệ toạ độ (0 0 0) về điểm này)

Lệnh TDT: tạo DimOrdinate cho CIRCLE, ARC

;;;Lisp AdddimOrdinate cho tâm CIRCLE, ARC         by Trân Thiêp 10/2021, tel 0918841230
(defun c:po0 (/)
    (setq po0
             (getpoint '(0 0 0)
                 "\nPick 1 \U+0111i\U+1EC3m to\U+1EA1 \U+0111\U+1ED9 quy chi\U+1EBFu"
             )
    )
)
(defun c:tdt (/ doc      *model   ucs_old  po13_1   po14_1   po13_2   po14_2
                90d      270d     360d     ent      centpo   eng      ang
                R        obdX     obdY     engX     engY     entodimX entodimY
                sel      popick
               )
    (setq doc    (vla-get-ActiveDocument (vlax-get-acad-object))
          *model (vla-get-modelspace doc)
    )
    (defun *error* (msg)
        (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
            (princ (strcat "\n** Error: " msg " **"))
        )
        (acet-sysvar-restore)
        (vla-EndUndoMark doc)
        (princ)
    )
    (vla-StartUndoMark doc)
    (acet-sysvar-set (list "cmdecho" 0 "osmode" 33))
    (setq ucs_old (acet-ucs-get nil))
    (acet-ucs-cmd '("w"))
    (setq 90d  (/ pi 2)
          360d (* pi 2)
          270d (* 90d 3)
    )
    (or po0 (setq po0 (getpoint "\nPick 1 \U+0111i\U+1EC3m to\U+1EA1 \U+0111\U+1ED9 quy chi\U+1EBFu")))
    (setvar "osmode" 0)
    (while
        (OR (NOT (setq sel (entsel "\nPick a CIRCLE, ARC")))
            (NOT (wcmatch (acet-dxf 0 (setq eng (entget (setq ent (car sel)))))
                          "CIRCLE,ARC"
                 )
            )
        )  (prompt "\nPick ch\U+01B0a Ðúng CIRCLE, ARC vui lòng pick l\U+1EA1i")
    )
    (setq popick (cadr sel))
    (setq centpo (trans (acet-dxf 10 eng) 0 1)
          R      (acet-dxf 40 eng)
    )
    (setq ang (angle centpo popick))
    (cond ((< 0 ang 90d)
           (setq po13_1 (polar centpo 0 R)
                 po14_1 (polar po13_1 0 10)
                 po13_2 (polar centpo 90d R)
                 po14_2 (polar po13_2 90d 10)
           )
          )
          ((< 90d ang pi)
           (setq po13_1 (polar centpo pi R)
                 po14_1 (polar po13_1 pi 10)
                 po13_2 (polar centpo 90d R)
                 po14_2 (polar po13_2 90d 10)
           )
          )
          ((< pi ang 270d)
           (setq po13_1 (polar centpo pi R)
                 po14_1 (polar po13_1 pi 10)
                 po13_2 (polar centpo 270d R)
                 po14_2 (polar po13_2 270d 10)
           )
          )
          ((< 270d ang 360d)
           (setq po13_1 (polar centpo 0 R)
                 po14_1 (polar po13_1 0 10)
                 po13_2 (polar centpo 270d R)
                 po14_2 (polar po13_2 270d 10)
           )
          )
    )
    (setq obdX (vla-AddDimOrdinate *model
                                   (vlax-3d-point (trans po13_1 1 0))
                                   (vlax-3d-point (trans po14_1 1 0))
                                   :vlax-false
               )
    )
    (setq obdY (vla-AddDimOrdinate *model
                                   (vlax-3d-point (trans po13_2 1 0))
                                   (vlax-3d-point (trans po14_2 1 0))
                                   :vlax-true
               )
    )
    (setq engX (entget (setq entodimX (vlax-vla-object->ename obdX))))
    (entmod (subst (cons 10 po0) (assoc 10 engX) engX))
    (entupd entodimX)
    (setq engY (entget (setq entodimY (vlax-vla-object->ename obdY))))
    (entmod (subst (cons 10 po0) (assoc 10 engY) engY))
    (entupd entodimY)
    (acet-sysvar-restore)
    (acet-ucs-set ucs_old)
    (vla-EndUndoMark doc)
    (princ "\nOk")
    (princ)
)

Chúc vui vẻ. Thiep

  • 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

Viết thế này cho gọn @thiep

(setq ent (entsel)
      cent (acet-dxf 10 (entget (car ent)))
      pick (cadr ent)
      r (distance cent pick)
      ang (angle cent pick)
      phantu (* pi 0.25)
      ang (fix (/ ang phantu)
      ang (* ang phantu)           ; p13_1,  p14_1
      ang1 (+ ang phantu)       ;  p13_2,  p14_2
      )
 

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

Lệnh po0: tạo điểm quy chiếu, (giống như dời điểm gốc hệ toạ độ (0 0 0) về điểm này)

Lệnh TDT: tạo DimOrdinate cho CIRCLE, ARC


;;;Lisp AdddimOrdinate cho tâm CIRCLE, ARC         by Trân Thiêp 10/2021, tel 0918841230
(defun c:po0 (/)
    (setq po0
             (getpoint '(0 0 0)
                 "\nPick 1 \U+0111i\U+1EC3m to\U+1EA1 \U+0111\U+1ED9 quy chi\U+1EBFu"
             )
    )
)
(defun c:tdt (/ doc      *model   ucs_old  po13_1   po14_1   po13_2   po14_2
                90d      270d     360d     ent      centpo   eng      ang
                R        obdX     obdY     engX     engY     entodimX entodimY
                sel      popick
               )
    (setq doc    (vla-get-ActiveDocument (vlax-get-acad-object))
          *model (vla-get-modelspace doc)
    )
    (defun *error* (msg)
        (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
            (princ (strcat "\n** Error: " msg " **"))
        )
        (acet-sysvar-restore)
        (vla-EndUndoMark doc)
        (princ)
    )
    (vla-StartUndoMark doc)
    (acet-sysvar-set (list "cmdecho" 0 "osmode" 33))
    (setq ucs_old (acet-ucs-get nil))
    (acet-ucs-cmd '("w"))
    (setq 90d  (/ pi 2)
          360d (* pi 2)
          270d (* 90d 3)
    )
    (or po0 (setq po0 (getpoint "\nPick 1 \U+0111i\U+1EC3m to\U+1EA1 \U+0111\U+1ED9 quy chi\U+1EBFu")))
    (setvar "osmode" 0)
    (while
        (OR (NOT (setq sel (entsel "\nPick a CIRCLE, ARC")))
            (NOT (wcmatch (acet-dxf 0 (setq eng (entget (setq ent (car sel)))))
                          "CIRCLE,ARC"
                 )
            )
        )  (prompt "\nPick ch\U+01B0a Ðúng CIRCLE, ARC vui lòng pick l\U+1EA1i")
    )
    (setq popick (cadr sel))
    (setq centpo (trans (acet-dxf 10 eng) 0 1)
          R      (acet-dxf 40 eng)
    )
    (setq ang (angle centpo popick))
    (cond ((< 0 ang 90d)
           (setq po13_1 (polar centpo 0 R)
                 po14_1 (polar po13_1 0 10)
                 po13_2 (polar centpo 90d R)
                 po14_2 (polar po13_2 90d 10)
           )
          )
          ((< 90d ang pi)
           (setq po13_1 (polar centpo pi R)
                 po14_1 (polar po13_1 pi 10)
                 po13_2 (polar centpo 90d R)
                 po14_2 (polar po13_2 90d 10)
           )
          )
          ((< pi ang 270d)
           (setq po13_1 (polar centpo pi R)
                 po14_1 (polar po13_1 pi 10)
                 po13_2 (polar centpo 270d R)
                 po14_2 (polar po13_2 270d 10)
           )
          )
          ((< 270d ang 360d)
           (setq po13_1 (polar centpo 0 R)
                 po14_1 (polar po13_1 0 10)
                 po13_2 (polar centpo 270d R)
                 po14_2 (polar po13_2 270d 10)
           )
          )
    )
    (setq obdX (vla-AddDimOrdinate *model
                                   (vlax-3d-point (trans po13_1 1 0))
                                   (vlax-3d-point (trans po14_1 1 0))
                                   :vlax-false
               )
    )
    (setq obdY (vla-AddDimOrdinate *model
                                   (vlax-3d-point (trans po13_2 1 0))
                                   (vlax-3d-point (trans po14_2 1 0))
                                   :vlax-true
               )
    )
    (setq engX (entget (setq entodimX (vlax-vla-object->ename obdX))))
    (entmod (subst (cons 10 po0) (assoc 10 engX) engX))
    (entupd entodimX)
    (setq engY (entget (setq entodimY (vlax-vla-object->ename obdY))))
    (entmod (subst (cons 10 po0) (assoc 10 engY) engY))
    (entupd entodimY)
    (acet-sysvar-restore)
    (acet-ucs-set ucs_old)
    (vla-EndUndoMark doc)
    (princ "\nOk")
    (princ)
)

Chúc vui vẻ. Thiep

@thiepCó vẻ chưa ổn trong UCS bá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
59 phút trước, quocmanh04tt đã nói:

@thiepCó vẻ chưa ổn trong UCS bác ạ!

Cũng có thể @quocmanh, bới vậy khi BV đang ở UCS, Thiệp đưa về WCS, sau khi chạy lisp thì trả về UCS cũ. Tuy nhiên, cũng chưa biết có ổn không, Thiệp thử ở cad 2007 thấy ok.

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
3 giờ trước, cuongtk2 đã nói:

Viết thế này cho gọn @thiep

(setq ent (entsel)
      cent (acet-dxf 10 (entget (car ent)))
      pick (cadr ent)
      r (distance cent pick)
      ang (angle cent pick)
      phantu (* pi 0.25)
      ang (fix (/ ang phantu)
      ang (* ang phantu)           ; p13_1,  p14_1
      ang1 (+ ang phantu)       ;  p13_2,  p14_2
      )
 

Đầu tiên là Thiệp tranh thủ nghĩ ra viết liền, không kịp nghĩ dùng thuật toán (fix 1/4pi) để xác định điểm pick ở góc nào của đường tròn . Cảm ơn @cuongtk2

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

Cũng có thể @quocmanh, bới vậy khi BV đang ở UCS, Thiệp đưa về WCS, sau khi chạy lisp thì trả về UCS cũ. Tuy nhiên, cũng chưa biết có ổn không, Thiệp thử ở cad 2007 thấy ok.

Bác thử xoay UCS 1 góc nào đó để kiểm tra.

Bản vẽ của chủ thớt hình như là lĩnh vực cơ khí, không phải chuyên môn nhưng mình đoán bốn điểm của hình tròn cần đo là các điểm mà khi chiếu vuông góc xuống các trục toạ độ sẽ có các giá trị cực tiểu và cực đại.

Lisp của bác 4 điểm đó với tính chất trên lại luôn thuộc WCS.

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

Các toạ độ tâm CIRCLE, ARC trong bản vẽ được quy chiếu theo 2 trục line màu đỏ nét CENTER2, hai đường này song song với trục tung và trục hoành nên có thể nói UCS đã chuyển đến điểm gốc quy chiếu này và không xoay. Bản vẽ gửi lên cũng đang là WCS, các điểm (dxf 10) của các dimordinate này đều quy về 1 điểm gốc quy chiếu này.

Đây là bản vẽ cơ khí có nhiều hệ lỗ, những dữ liệu toạ độ CIRCLE, ARC này có thể là đầu vào cho máy CNC chạy.

image.png.0d8e7fd856515b34d2f513c1cfafcc49.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

Hehehe...

- Chỉ là giải quyết bài toán của chủ thớt thì lisp ổn rồi, cũng như chỉ cần lisp của Mr. Cuong ở trên cũng đã ok mà lại ngắn gọn (chỉ cần đưa hệ toạ độ về đúng vị trí của nó - thông qua lệnh UCS, nếu là cad đời cao chỉ cần pick vào cái biểu tượng và kéo là được).

- Ở trên thấy bác nói không dùng command, việc này đồng nghĩa với việc phải sử dụng nhiều kiến thức về lisp hơn (nhất là liên quan đến UCS), nên anh em chờ bác post để tham khảo (nói như Mr. alisp ở trên).

-  Vấn đề này thì chỉ sửa lại lisp của Mr. Cuong chút xíu... là đáp ứng được.

Vào lúc 27/10/2021 tại 11:38, thiep đã nói:

từ điểm pick, lisp hiểu sẽ tạo 2 dimordinate ở 2 điểm quadrant nào, không nên cứng nhắc chỉ là tạo 2 dimordinate dưới và phải.

(defun c:tt  (/ cen ent lsp poi rad sel)
  (while (setq sel (entsel "\nPick duong tron:"))
    (setq ent (entget (car sel))
          cen (trans (acet-dxf 10 ent) 0 1)
          rad (acet-dxf 40 ent)
          poi (cadr sel)
          lsp (mapcar '(lambda (x / p) (setq p (polar cen (* x pi) rad)) (list p (polar p (* x pi) 1.2)))
                      '(0 1 0.5 1.5))
          lsp (vl-sort lsp '(lambda (x y) (> (distance (car x) poi) (distance (car y) poi)))))
    (mapcar '(lambda (x) (command "_dimordinate" "_none" (car x) "_none" (cadr x)))
            (cddr lsp)))
  (princ))

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

Không thấy thớt nói năng chi, chắc chưa hài  lòng, có lẽ phải tính phương án quét toàn bộ vòng tròn chứ pick từng cái tốn time quá chăng? Nếu như vậy chắc phải trả phí chứ phần free tới đây là chấm dứt đó nhen!!

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  

×