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

Nhờ Sửa Lỗi Lisp

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

Test thử nhé!

(defun c:tt (/ setdynblk_propvalue getangle_pl ang blk ent lfilter laylist ss)

(defun setdynblk_propvalue (blk prp val / vtw ang val prp)

(vla-put-rotation blk 0)

(setq prp (strcase prp))

(vl-some '(lambda (x)

(if (= prp (strcase (vla-get-propertyname x)))

(progn (vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))

(cond (val)

(t)))))

(vlax-invoke blk 'getdynamicblockproperties))

(setq val (rem val (* 2 pi))

vtw (rem (getvar "viewtwist") (* 2 pi))

ang (rem (+ val vtw) (* 2 pi)))

(cond ((< (* 0.5 pi) ang (* 1.5 pi)) (setq val (+ val pi))))

(mapcar '(lambda (a) (vla-put-rotation a val)) (vlax-invoke blk 'getAttributes)))

;;-----------------------------------------

(defun getangle_pl (ent / el p1 p2 ang pl)

(setq el (entget ent)

p1 (cdr (assoc 10 el))

p2 (cdr (assoc 10 (reverse el)))

ang (+ (angle p2 p1) (* 0.5 pi)))

(cond ((and (> ang (* 0.5 pi)) (< ang (* 1.5 pi))) (setq ang (+ ang pi)))

((equal ang (* 1.5 pi) 1e-6) (setq ang (* 0.5 pi))))

ang)

;; Main

(setq laylist '("00-VT" "00-D195" "00-D130 TT" "00-D130 HT" "00-D65 MD")

laylist (mapcar '(lambda (x) (strcase x)) laylist))

(setq lfilter (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) laylist)))

(while (setq ss (ssget (list (cons 0 "LWPOLYLINE")(cons 8 lfilter))))

(setq ent (car (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))

ang (getangle_pl ent))

(while (and (setq blk (car (entsel "\nPick Block: "))) (eq (cdr (assoc 66 (entget blk))) 1))

(setdynblk_propvalue (vlax-ename->vla-object blk) "Angle1" ang)))

(princ))

Điểm G nằm ở chỗ này:

(setq val (rem val (* 2 pi))

        vtw (rem (getvar "viewtwist") (* 2 pi))

        ang (rem (+ val vtw) (* 2 pi)))

  (cond ((< (* 0.5 pi) ang (* 1.5 pi)) (setq val (+ val pi))))

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

Test thử nhé!

(defun c:tt (/ setdynblk_propvalue getangle_pl ang blk ent lfilter laylist ss)

(defun setdynblk_propvalue (blk prp val / vtw ang val prp)

(vla-put-rotation blk 0)

(setq prp (strcase prp))

(vl-some '(lambda (x)

(if (= prp (strcase (vla-get-propertyname x)))

(progn (vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))

(cond (val)

(t)))))

(vlax-invoke blk 'getdynamicblockproperties))

(setq val (rem val (* 2 pi))

vtw (rem (getvar "viewtwist") (* 2 pi))

ang (rem (+ val vtw) (* 2 pi)))

(cond ((< (* 0.5 pi) ang (* 1.5 pi)) (setq val (+ val pi))))

(mapcar '(lambda (a) (vla-put-rotation a val)) (vlax-invoke blk 'getAttributes)))

;;-----------------------------------------

(defun getangle_pl (ent / el p1 p2 ang pl)

(setq el (entget ent)

p1 (cdr (assoc 10 el))

p2 (cdr (assoc 10 (reverse el)))

ang (+ (angle p2 p1) (* 0.5 pi)))

(cond ((and (> ang (* 0.5 pi)) (< ang (* 1.5 pi))) (setq ang (+ ang pi)))

((equal ang (* 1.5 pi) 1e-6) (setq ang (* 0.5 pi))))

ang)

;; Main

(setq laylist '("00-VT" "00-D195" "00-D130 TT" "00-D130 HT" "00-D65 MD")

laylist (mapcar '(lambda (x) (strcase x)) laylist))

(setq lfilter (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) laylist)))

(while (setq ss (ssget (list (cons 0 "LWPOLYLINE")(cons 8 lfilter))))

(setq ent (car (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))

ang (getangle_pl ent))

(while (and (setq blk (car (entsel "\nPick Block: "))) (eq (cdr (assoc 66 (entget blk))) 1))

(setdynblk_propvalue (vlax-ename->vla-object blk) "Angle1" ang)))

(princ))

Điểm G nằm ở chỗ này:

(setq val (rem val (* 2 pi))

        vtw (rem (getvar "viewtwist") (* 2 pi))

        ang (rem (+ val vtw) (* 2 pi)))

  (cond ((< (* 0.5 pi) ang (* 1.5 pi)) (setq val (+ val pi))))

Phải gọi là quá đỉnh quá đỉnh, haha! anh là chuyên gia tìm điểm G, cảm ơn anh rất nhiều (thật tuyệt vời). Em đang tiếp tục mò điểm G (lấy giao điểm để đặt block)

Để lấy khoảng cách max min phải dùng hàm foreach kết hợp với repeat để tạo ra 1 cái list, rồi mới so từng điểm trong list này phải không anh.

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ải gọi là quá đỉnh quá đỉnh, haha! anh là chuyên gia tìm điểm G, cảm ơn anh rất nhiều (thật tuyệt vời). Em đang tiếp tục mò điểm G (lấy giao điểm để đặt block)

Để lấy khoảng cách max min phải dùng hàm foreach kết hợp với repeat để tạo ra 1 cái list, rồi mới so từng điểm trong list này phải không anh.

Cẩn tắc khi đặt Block vào điểm G, hậu họa khôn lường! :D

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ẩn tắc khi đặt Block vào điểm G, hậu họa khôn lường! :D

Haha, em mò trúng điểm G rồi, chạy ngon lành, sử dụng ssname lấy đường đầu và đường cuối là xong. Cảm ơn anh đã nhiệt tình giúp đỡ nhé! 

Hẹn gặp anh và diễn đàn ở điểm G tiếp theo. Haha!!!!! Thanks a lot!!!!!

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. Xác định điểm giữa của nhóm đường quét chọn (Sau khi có điểm nhập vào do lisp yêu cầu):

- Từ điểm nhập vào kẻ 1 đường (Line, Pline, Xline tùy ý) vuông góc với 1 trong các đường quét chọn (tham khảo: http://www.cadviet.com/forum/topic/69045-nho-chinh-sua-lisp-xoay-text-theo-pline/page-2

để tìm góc).

- Xác định giao điểm của đường vừa vẽ với các đường quét chọn.

- Sort các điểm giao (so sánh khoảng cách các điểm giao với điểm nhập vào) -> Tìm được điểm xa nhất, gần nhất so với điểm nhập vào -> Trung điểm của 2 điểm xa nhất và gần nhất.

Như vậy ta có các điểm: điểm nhập vào, điểm xa nhất, gần nhất và điểm giữa, sử dụng thế nào điều đó tùy thuộc ở bạn.

2. Kéo dài được block động (stretch đuôi block trước khi insert) => Sau khi insert mới kéo dài.

- Ctrl+1 chọn DynBlock thì thấy distance1 đó là biến kéo dài (hoặc các prop khác Flip, angle...), dùng hàm con sau để điều khiển nó:

(defun setdyn_propvalue  (blk prp val)

  (setq prp (strcase prp))

  (vl-some '(lambda (x)

             (if (= prp (strcase (vla-get-propertyname x)))

              (progn (vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))

                     (cond (val)

                           (t)))))

           (vlax-invoke blk 'getdynamicblockproperties)))

Vd: (setdyn_propvalue "Obj_Block" "distance1" 100)

3. Chúc thành công...!

Bạn quocmanh04tt cho mình hỏi có hàm nào lấy lại "distance1" không (nghĩa là khi tích vào bock ta lấy được giá trị "distance1")

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ó đây:

(defun getdynpropvalue  (blk prp)
  (setq prp (strcase prp))
  (vl-some '(lambda (x)
             (if (= prp (strcase (vla-get-propertyname x)))
              (vlax-get x 'value)))
           (vlax-invoke blk 'getdynamicblockproperties)))

  • 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- Gạch thứ nhất:

+ Tìm giao điểm:

(vlax-invoke (vlax-ename->vla-object ent1) 'IntersectWith (vlax-ename->vla-object ent2) acExtendThisEntity)

* Trong đó: ent1, ent2 là ename

acExtendNone => Does not extend either object.

acExtendThisEntity => Extends the base object.

acExtendOtherEntity => Extends the object passed as an argument.

acExtendBoth => Extends both objects.

Bạn cho mình hỏi thêm tí nữa

Có hơn 1 điểm giao thì làm sao lấy tọa độ của các điểm

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 cho (princ lst) kết quả trả về thì rõ ngay.

VD: kq có 2 giao điểm nó sẽ có 1 list thế này: (x1 y1 z1 x2 y2 z2), từ đây mỗi 3 phần tử của list là 1 điểm, thứ tự từ đầu list đến cuối.

Xử lý tiếp theo tùy thuộc ở bạn.

  • 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

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


×