Chuyển đến nội dung
Diễn đàn CADViet

ngokiet

Thành viên
  • Số lượng nội dung

    404
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    43

Bài đăng được đăng bởi ngokiet


  1. 46 phút trước, long999 đã nói:

    Đúng là như vậy, cảm ơn các anh đã giải đáp ạ !

    Anh viết giúp em cái dòng lệnh để nó đổi màu kết quả đi, kể cả kết quả giữ nguyên hay kết quả thay đổi thì nó cũng đổi sang màu khác đi ( ví dụ màu vàng ) cho nó dễ phân biệt và đỡ nhầm với số chưa tính ạ !

    Mình sợ bác luôn. Lisp chạy hay ko mà cũng ko biết.

    Nó đổi layer cho bạn rồi còn gì. 

    (chdxf 8 "KQ_SN" tKq) lệnh này đổi layer đó

     Nếu sửa lại

    (chdxf 62 1 tKq) Đổi color thành 1


  2. 25 phút trước, long999 đã nói:

    ko phải thiếu layer, vì cùng file đó tích vào cái text khác thì nó lại chạy. Một số text thì ko chạy ? mà các text đó cùng 1 cách tạo ra, cùng từ 1 phần mềm tạo ra ? ko hiểu vì sao luôn ạ !

    Mình thử file của bác thì khi chọn text nào cũng không bị lỗi.

    Hay là do kết quả đúng rồi nên bác không thấy nó chạy???

     

     


  3. 19 giờ trước, AUTOCAD_2019 đã nói:

    Mình đã thử dùng lệnh pe nhưng nó tự động nối lại nhưng chỗ mà mình không muốn và rất khó kiểm soát lắm ... mình có đưa bản vẽ ngay phía dưới đó bạn ... cái mình cần là tìm ra nhưng chỗ bị hở để mình nối nó lại như những chỗ trong file mình gửi á, để mình gửi lại...

    file cad mau 2.dwg

    Bản vẽ của bạn chồng nét rất nhiều nên nếu viết lisp nó chạy rất lâu khó kiểm tra lỗi.


  4. 22 giờ trước, AUTOCAD_2019 đã nói:

    cái mình cần ở đây là tìm ra chỗ bị hở chứ không phải là hatch được hay không ví dụ như là nếu polyline đó chưa khép thì mình cần biết vị trí chỗ hở để bít nó lại ....

    polyline chưa khép kín thì bạn bấm vào polyline đó xem nó close hay không?

    Hay kiểm tra vector 1 của polyline đó thôi.

    Còn vùng giới hạn nhiều line,arc, polyline thì thử pedit join lại xem nó ko join dc chỗ nào thì hở chỗ đó.

    Còn viết lisp thì chỉ có thể dễ nhất là tìm 2 đỉnh có khoảng cách nhỏ hơn 1 giá trị nào đó thì báo ra thôi. Cũng có thể kiểm tra 2 điểm đó thuộc 2 đường có cắt nhau hay ko. Nhưng phức tạp hơn. Tuy nhiên việc bạn muốn làm là như thế nào vùng khép kín gồm những thành phần nào pl,line, arc, elip, block, spline... Thì mới viết theo đúng ý bạn dc chứ. 

    Ít ra đưa bản vẽ lên , bạn muốn lệnh hiện như thế nào thông báo cho bạn.

     

    • Like 1

  5. (vl-sort(vl-sort lst ‘(lambda(x y) (< (car x) (car y))))‘(lambda(x y) (< (cadr x) (cadr y)))))

    Đại loại vậy vì mình ko trên máy tính.

    Còn sort giá trị gần đúng thì khó chịu vì khi có giá trị liên hoàn nhau. Nhất là sort điểm. dễ xảy ra lỗi.

    số do máy tính tính thường có sai số. 

    thử lệnh sau (= (- 3.3333 3.333) 0.0003)

     

    • Like 1

  6. 5 phút trước, Doan Nguyen Van đã nói:

    Bác viết ngắn thật, mình có viết thử nhưng dài hơn, còn phải học hỏi nhiều

    Chủ yếu là thuật toán như thế nào thôi.

    Lúc đầu tính sort theo 2 phương x,y nhưng đôi khi trục x hơi lệch 1 chút làm nó nhảy bậy.

    Giống bài trước nhưng bài trước phương x khó xét quá làm theo cách này cũng sai số nhiều.

     


  7. 1 giờ} trướ}c, qlinh222 đã nói:

    Cảm ơn @Duong Nhat Duy, mình đã thử làm lại, load lại file Linetype sửa theo bạn hướng dẫn, nhưng kết quả vẫn như cũ, nếu có thể, bạn có thể load kiểm tra giùm mình không.

    Cảm ơn bạn.

    Bạn tham khảo ở đây nè.

    https://knowledge.autodesk.com/support/autocad-lt/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/AutoCAD-LT/files/GUID-FEDCE7EB-4919-43AE-A54E-F3A293DD60CA-htm.html

    Có r=0 thì bỏ u=0


  8. Mình thấy là đề bài là điểm gần nhât của đoạn thăng mà. Đâu phải là đỉnh đâu.

    Muốn thêm thì xét ngược các đỉnh pline với dt là dc rồi.

    Còn hàm vlax-curve-getclosepointtoProjection hình như bác nên thêm tham số nill và xét nếu nằm ngoài pline theo phương trục Y thì ko di chuyển.

    Ps. Cái này mình thấy ít có ứng dụng nhiều cho Cad nên như vậy cũng dc rồi. Nếu sai chỗ nào thì sửa thủ công thôi. Nhưng mình nói để biết chỗ nào có thể chạy sai thôi.


  9. 1 giờ} trướ}c, Doan Nguyen Van đã nói:
    
    (defun c:mm (/ getlst ss n ent osm lst2 lst ent1 pt1 pt2 tt p1 i x y)
      (defun getlst (p1 ent / p2 dis)
          (setq p2 (vlax-curve-getClosestPointToProjection ent p1 (list 0 1 0) ))
          (setq dis (distance p1 p2))
          (list dis p1 p2)	)
      (if(setq ss (acet-ss-to-list (ssget (list (cons 0 "LWPOLYLINE,LINE,CIRCLE,ARC"))))) (progn (setq n 0)
    (mapcar '(lambda (x) (if (= (cdr (assoc 0 (entget x))) "LWPOLYLINE") (if (> (vlax-curve-getendparam x) n) (progn(setq ent x) (setq n (vlax-curve-getendparam x)))))) ss)
      (setq lst2 (list))
      (Mapcar '(lambda (ent1)
        (setq lst (list))
        (if (= (cdr (assoc 0 (entget ent1))) "LINE") (progn
    	(setq pt1 (vlax-curve-getpointatparam ent1 (vlax-curve-getstartparam ent1)))
    	(setq pt2 (vlax-curve-getpointatparam ent1 (vlax-curve-getendparam ent1)))
    	(foreach p1 (list pt1 pt2)
            (setq lst (append lst (list (getlst p1 ent))))
    	  )))
        (if (= (cdr (assoc 0 (entget ent1))) "LWPOLYLINE")(progn
        (setq i (vlax-curve-getstartparam ent1))
        (while (setq p1 (vlax-curve-getpointatparam ent1 i))
          (setq i (1+ i))
          (setq lst (append lst (list (getlst p1 ent))))
          )))
        (if (wcmatch (setq tt (cdr (assoc 0 (entget ent1)))) "ARC,CIRCLE") (progn
        (if (= tt "CIRCLE") (setq p  (vla-get-circumference (vlax-ename->vla-object ent1))))
        (if (= tt "ARC")  (setq p  (vla-get-arclength (vlax-ename->vla-object ent1))))
        (setq  i 0)
        (while (< i p)
          (setq p1 (vlax-curve-getpointatdist ent1 i))
          (setq i (+ 0.1 i))
          (setq lst (append lst (list (getlst p1 ent))))
          )))
        (setq lst (vl-sort lst '(lambda (x y) (< (car x) (car y)))))
        (setq lst2 (append lst2 (list (list (vlax-ename->vla-object ent1) (cadr (car lst)) (caddr (car lst))))))
        ) ss)
      (Mapcar '(lambda (lst)(vla-Move (car lst) (vlax-3d-point (cadr lst)) (vlax-3d-point (caddr lst)))) lst2)
      ))
      (princ))

    Đối với ARC và CIRCLE mới lấy được tiếp tuyến tại điểm có độ chính xác 0.1, k biết các bác có ý tưởng nào hay hơn về vấn đề này ? 

    Tính chính xác theo toán thì mình biết là như vậy (xem hình)

    h=(d-r)/sinA 

    h: là khoảng cách move

    d: Là khoảng cách từ tâm đến đường thắng

    r:: Bán kính cung tròn

    A: góc của dt so trục y.

    Mình test với lisp của bạn thì còn trường hợp như line,arc move xuống mà không dính đỉnh mà cũng không tiếp xúc nữa.(xem hình nhỏ)

    Còn theo phương pháp move từ từ thì có thể cải thiện độ chính xác bằng cách dùng vòng lặp chia nhỏ giá trị move.

    Untitled-1.jpg

×