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

18011985

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

    259
  • Đã tham gia

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

  • Ngày trúng

    3

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


  1. Cảm ơn các bài trao đổi của các bác. Các bác test giúp em nhé. Lệnh Vla-delete cad2012 không thực hiện được các bác sửa dùm em.

    (defun c:tt  (/ i item lst obj pt)
    (vl-load-com)
      (setq i 0)
      (while (setq pt (getpoint "\nChon diem:"))
        (cond ((= i 0)
      (progn
        (vl-cmdf "-boundary" "a" "o" "r" "" pt "")
        (setq obj (vlax-ename->vla-object (entlast)))
        (setq item (cons (vlax-get obj 'Centroid) (vlax-get obj 'Area)))
        ;(vla-delete obj)
        (setq lst (cons item lst))
        )
      )
     ((/= i 0)
      (progn
        (vl-cmdf "-boundary" "a" "o" "r" "" pt "")
        (setq obj (vlax-ename->vla-object (entlast)))
        (setq item (cons (vlax-get obj 'Centroid) (vlax-get obj 'Area)))
        (if (/=(member item lst)nil)
          (alert "trung roi...")
          (setq lst (cons item lst)))
        ;(vla-delete obj)
        )
      )
     )
        (setq i (1+ i))
        )
      
      lst)

  2. Mình viết đoạn code để lọc hình pick trùng nhưng thỉnh thoảng vẫn trả kết quả sai. Mong các bạn góp ý chỉnh sửa

     

    (defun c:ax (/ I a1 FOD KT dtlist tglist k)
      (defun kiemtra (z1 z2 z3 / i itest atest ctest)
        (setq i 0)
        (setq itest (-(length z2)1))
        (while (<= i itest)
          (setq atest (vlax-get z1 'Area))
          (setq ctest (vlax-get z1 'Centroid))
          (if (and (equal atest (nth i z2)0.0001)
          (equal (car ctest) (car (nth i z3))0.0001)
          (equal (cadr ctest) (cadr (nth i z3)))0.0001)
    (progn
     (setq k 1)
     (setq i (+ itest 1))
     )
    (progn
    (setq k 0)
     )
    )
          (setq i (+ i 1))
          (Setq atest nil)
          (Setq ctest nil)
          )
        (if (= k 1) (alert "trung roi") (alert "ok"))
          
        );end kiem tra
      (setq i 0)
      (setq k 0)
      (while (setq a1 (getpoint "\n Chon diem:" ))
        (if (eq i 0)
          (progn
    (command "-boundary" "a" "o" "r" "" a1 "")
    (setq FOD (vlax-ename->vla-object (entlast)))
    (setq dtlist (append dtlist (list (vlax-get FOD 'Area))))
    (setq tglist (append tglist (list (vlax-get FOD 'Centroid))))
    (command "erase" (entlast) "")
    );end progn
          (progn
    (command "-boundary" "a" "o" "r" "" a1 "")
    (setq KT (vlax-ename->vla-object (entlast)))
    (kiemtra KT dtlist tglist)
    (if (= k 0)
     (progn
       (setq dtlist (append dtlist (list(vlax-get KT 'Area))))
       (setq tglist (append tglist (list(vlax-get KT 'Centroid))))
       )
     )
    (command "erase" (entlast) "")
    ;(setq i (+ i 1))
    );end progn
          );end if
        (setq i (+ i 1))
        );end while
      (princ dtlist)
      ); end defun
     
    ;;;;      
    

  3. Mình đã đọc các lisp pick diện tích trên diễn đàn và các lisp có 1 khuyết điểm không lọc được hình pick trùng.

    Các bạn giúp mình lisp pick diện tích sử dụng boundary (region) và có lọc các hình pick trùng.

    - Có 3 hình pick diện tích. Sau khi pick 3 hình thì mình pick lại 1 hình nào đó thì mình muốn CAD báo hình đã pick và không tính diện tích hình bị trùng đấy.

    Rất mong các bạn giúp đỡ!

     


  4. Cảm ơn bạn đã giúp đỡ. Mình có cách khác là copy tất cả đối tượng từ bản vẽ Block hỏng sang bản vẽ block không hỏng là ok.

    Nhưng có các bất cập:

    - Chỉnh lại toàn bộ layout

    - Mất các đối tượng ẩn

    Mình đã thử cách xoá hết block đó sau đó purge nhưng không ăn thua. Copy lại vẫn bị như vậy.

    Bạn xem có cách khác không. Nó có phải do biến hệ thống không.


  5. Mình test đúng trên bản vẽ đó. Nhưng mặt cắt không đúng với thực tế là cao trình đỉnh giữa của pline phải cao hơn (hoặc thấp hơn) cao trình đường đồng mức trong cùng. Bạn phải thêm bằng thủ công hoặc vẽ thêm 1 pline cao trình lẻ qua đỉnh đó

    Vấn đề không nằm ở đó bạn à. mình post ở đây bạn xem nhé

    http://www.cadviet.com/forum/topic/85502-nho-giup-do-lisp-tim-giao-diem/


  6. Sau khi nhận được sự giúp đỡ từ các bạn trên diễn đàn mình đã chỉnh sửa và hoàn thành lisp tìm giao điểm.

    Nhưng trong quá trình test lisp mình gặp phải rắc rối sau.

    Cùng 1 tập hợp đối tượng nhưng ở 2 bản vẽ khác nhau cho 2 kết quả khác nhau.

    Vậy chứng tỏ lisp không cho kết quả sai mà định dạng của 2 file bản vẽ có vấn đề. Các bạn có thể chỉ ra hộ mình không?

    Mình không dành về biến định dạng của file lắm.

    Bản vẽ cho kết quả đúng:http://www.cadviet.com/upfiles/3/10633_test1_1.dwg

    Bản vẽ cho kết quả sai:http://www.cadviet.com/upfiles/3/10633_dongmuc_1.dwg

    (defun c:tt (/ E1 E2 ELE ELE1 PLST PST SSL)

      ;;;;----------------------------Relist------------------------------
      (defun relist (lst / lst1)
    ;;;writen by Tue_NV
      (foreach x lst
       (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))
       (Progn
       (foreach y lst1
       (if (equal y x 1.0e-8)
       (setq lst1 (vl-remove y lst1))
       );end if
    );end Foreach
       (setq lst1 (append lst1 (list x)))
        );end progn
    );end Foreach
        )
      ;;;;;-------------------------Chay chuong trinh----------------------
    (princ "\n Chon duong dong muc: ")
    (setq ssl (acet-ss-to-list (ssget))
              plst (list)
              e2 (car (entsel "\n Chon duong tim")))
      ;;;;--------------------------Tim giao diem khong gian------------------------
    (foreach en ssl
           (cond
                 ((= (cdr (assoc 0 (entget en))) "LWPOLYLINE") (setq ele (cdr (assoc 38 (entget en)))))
                 ((= (cdr (assoc 0 (entget en))) "POLYLINE")(setq ele (last (cdr (assoc 10 (entget en))))))      
                 ((= (cdr (assoc 0 (entget en))) "LINE") (setq ele (last (cdr (assoc 10 (entget en))))))
          ((= (cdr (assoc 0 (entget en))) "TEXT") (progn (setq ele 0)(setq ele1 (cdr (assoc 10 (entget en))))))
                 (T (setq ele nil))
           )
          (if ele
    (progn
       (if (= ele 0)
         (progn
           (setq plst (append plst (list ele1)))
           )
         (progn
           (command "copy" e2 "" (list 0 0 0) (list 0 0 ele))
           (setq e1 (entlast)
          plst (append plst (acet-geom-intersectwith e1 en 0)) )
           (command "erase" e1 "")
           )
         )
       )
    )
      )
      ;;;;;;;-----------------------------Sap xep va xoa diem trung--------------------------
      (setq plst (relist plst))
      (if(= (cdr(assoc 0 (entget e2))) "LINE")
        (progn
          (setq pst (vlax-curve-getStartPoint e2))
          (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
          )
        (progn
          (setq plst (vl-sort plst '(lambda (x y) (< (vlax-curve-getparamatpoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getparamatpoint e2 (list (car y) (cadr y) 0))))))
          )
        )
      (princ plst)
      (princ)
      )

     


  7.  

    Tách thành 2 trường hợp

     

    (if (= (cdr (assoc 0 (entget e2))) "LINE")
            (progn
                (setq pst (vlax-curve-getStartPoint e2))
                (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
            )
            (setq plst (vl-sort plst '(lambda (x y)
                (< (vlax-curve-getparamatpoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getparamatpoint e2 (list (car y) (cadr y) 0)))))))
    

    mình cũng đã tách. Nhưng với bản vẽ #7 thì không cho kết quả đúng. Bạn có thể xem lại giúp mình không?

    Mình thử bản vẽ mới thì tất cả ok. Nhưng với bản vẽ mình up lên ở #7 thì không đúng. Bạn có thể nói cho mình vì sao nó lại sai lệch không.


  8. Hàm vlax-curve-getparamatpoint sẽ cho kết quả sai đối với LINE, vì vậy bạn dùng đường tìm giao điểm là pline hoặc dùng đoạn code sau thay cho

    (setq plst (vl-sort plst .....

     

    (setq pst (vlax-curve-getStartPoint e2))
    (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
    

    Code bạn viết dùng (car vtmc) (cadr vtmc) rất nhiều chỗ, nên đặt biến trung gian VD: xo, yo

    (+ (carvtmc) -30)  => x1

    (+ (car vtmc) -31)  => x2

    Dùng hàm atoi thay vì atof đối với số nguyên

    (rtos (setq moc0 (+ moc0 1)) 2 0) => (atoi (setq moc0 (1+ moc0)))

    Trong trường hợp như hình vẽ thì hàm của bạn chưa đúng bạn có thể sửa giúp mình không, mình đã nghĩ ra 1 hàm nhưng kết quả vẫn sai.

    http://www.cadviet.com/upfiles/3/10633_dongmuc.dwg

    (setq plst (vl-sort plst '(lambda (x y) (< (vlax-curve-getDistAtPoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getDistAtPoint e2 (list (car y) (cadr y) 0))))))
    

  9. ops sorry bác.

    Để em ngăt phần không liên quan.

    (defun c:tt (/ E1 E2 ELE ELE1 PLST PST SSL)

      ;;;;----------------------------Relist------------------------------
      (defun relist (lst / lst1)
    ;;;writen by Tue_NV
      (foreach x lst
       (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))
       (Progn
       (foreach y lst1
       (if (equal y x 1.0e-8)
       (setq lst1 (vl-remove y lst1))
       );end if
    );end Foreach
       (setq lst1 (append lst1 (list x)))
        );end progn
    );end Foreach
        )
      ;;;;;-------------------------Chay chuong trinh----------------------
    (princ "\n Chon duong dong muc: ")
    (setq ssl (acet-ss-to-list (ssget))
              plst (list)
              e2 (car (entsel "\n Chon duong tim")))
      ;;;;--------------------------Tim giao diem khong gian------------------------
    (foreach en ssl
           (cond
                 ((= (cdr (assoc 0 (entget en))) "LWPOLYLINE") (setq ele (cdr (assoc 38 (entget en)))))
                 ((= (cdr (assoc 0 (entget en))) "POLYLINE")(setq ele (last (cdr (assoc 10 (entget en))))))      
                 ((= (cdr (assoc 0 (entget en))) "LINE") (setq ele (last (cdr (assoc 10 (entget en))))))
          ((= (cdr (assoc 0 (entget en))) "TEXT") (progn (setq ele 0)(setq ele1 (cdr (assoc 10 (entget en))))))
                 (T (setq ele nil))
           )
          (if ele
    (progn
       (if (= ele 0)
         (progn
           (setq plst (append plst (list ele1)))
           )
         (progn
           (command "copy" e2 "" (list 0 0 0) (list 0 0 ele))
           (setq e1 (entlast)
          plst (append plst (acet-geom-intersectwith e1 en 0)) )
           (command "erase" e1 "")
           )
         )
       )
    )
      )
      ;;;;;;;-----------------------------Sap xep va xoa diem trung--------------------------
      (setq plst (relist plst))
      (setq pst (vlax-curve-getStartPoint e2))
      (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
      )

    Bác xem giúp hộ em nhé.


  10. Mình đang cần loại bỏ phần tử giống nhau trong 1 biến list. Nhưng không được. Mình tìm trên Diễn đàn có của bác TUEVN nhưng up vào lisp không làm được. Các bác sửa giúp em.

    (defun c:tes (/ a)

      (setq a '((558911.0 2.37805e+006 130.0) (558906.0 2.37805e+006 129.0) (558902.0 2.37805e+006 128.0) (558899.0 2.37804e+006 127.0) (558896.0 2.37804e+006 126.0) (558894.0 2.37804e+006 125.0) (558892.0 2.37804e+006 124.0) (558890.0 2.37804e+006 123.0) (558887.0 2.37804e+006 122.0) (558885.0 2.37804e+006 121.0) (558883.0 2.37804e+006 120.0) (558881.0 2.37804e+006 119.0) (558878.0 2.37804e+006 118.0) (558875.0 2.37803e+006 117.0) (558872.0 2.37803e+006 116.0) (558872.0 2.37803e+006 116.0) (558870.0 2.37803e+006 115.0) (558869.0 2.37803e+006 114.0) (558867.0 2.37803e+006 113.0) (558865.0 2.37803e+006 112.0) (558863.0 2.37803e+006 111.0) (558862.0 2.37803e+006 110.0) (558862.0 2.37803e+006 110.0) (558860.0 2.37803e+006 109.0) (558858.0 2.37803e+006 108.0) (558857.0 2.37803e+006 107.0) (558855.0 2.37803e+006 106.0) (558853.0 2.37803e+006 105.0) (558852.0 2.37803e+006 104.0) (558850.0 2.37803e+006 103.0) (558849.0 2.37802e+006 102.0) (558847.0 2.37802e+006 101.0) (558845.0 2.37802e+006 100.0) (558843.0 2.37802e+006 99.0) (558842.0 2.37802e+006 98.0) (558840.0 2.37802e+006 97.0) (558838.0 2.37802e+006 96.0) (558836.0 2.37802e+006 95.0) (558834.0 2.37802e+006 94.0) (558832.0 2.37802e+006 93.0) (558830.0 2.37802e+006 92.0) (558828.0 2.37802e+006 91.0) (558826.0 2.37802e+006 90.0) (558824.0 2.37801e+006 89.0) (558823.0 2.37801e+006 88.0) (558821.0 2.37801e+006 87.0) (558819.0 2.37801e+006 86.0) (558817.0 2.37801e+006 85.0) (558815.0 2.37801e+006 84.0) (558813.0 2.37801e+006 83.0) (558813.0 2.37801e+006 83.0) (558812.0 2.37801e+006 82.0) (558810.0 2.37801e+006 81.0) (558810.0 2.37801e+006 81.0) (558810.0 2.37801e+006 81.0) (558810.0 2.37801e+006 81.0) (558808.0 2.37801e+006 80.0) (558806.0 2.37801e+006 79.0) (558804.0 2.37801e+006 78.0) (558802.0 2.37801e+006 77.0) (558800.0 2.37801e+006 76.0) (558798.0 2.378e+006 75.0) (558796.0 2.378e+006 74.0) (558795.0 2.378e+006 73.0) (558793.0 2.378e+006 72.0) (558789.0 2.378e+006 71.0) (558784.0 2.378e+006 70.0) (558784.0 2.378e+006 70.0) (558784.0 2.378e+006 70.0) (558784.0 2.378e+006 70.0) (558784.0 2.378e+006 70.0)))
      (defun relist (lst / lst1)
    ;;;writen by Tue_NV
      (foreach x lst
       (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))
       (Progn
       (foreach y lst1
       (if (equal y x 1.0e-8)
       (setq lst1 (vl-remove y lst1))
       )
    )
       (setq lst1 (append lst1 (list x)) )
        )
    )
        lst1
        )
      (relist a)
      (princ a)
      (princ)
      )

×