Đến nội dung


Hình ảnh
- - - - -

[Đã xong] lisp sắp xếp các DIM


  • Please log in to reply
7 replies to this topic

#1 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 11 September 2012 - 02:07 PM

Trước đây trên cadviet đã có lisp sắp xếp các DIM mình đã dùng nhưng chưa vừa ý. Hôm nay mình viết lại lisp sắp DIM với những đặc điểm sau:
- sắp được các DIM ngang, đứng, nghiêng
- sắp cùng lúc các DIM ngang và đứng
- trong 1 dòng lệnh sắp DIM:
+ Đường dóng các DIM sau không cắt ngang qua các DIM trước
+ Lần chọn thứ nhất gồm các DIM ngang và đứng, lần 2 chỉ có DIM ngang, lần 3 có các DIM ngang và đứng thì DIM đứng ở lần 3 vẫn được sắp sát vào DIM đứng ở lần 1

Mặc định thì chiều dài đường dóng bằng 3 lần chiều cao text của DIM, khoảng cách giữa 2 lớp DIM bằng 4 lần chiều cao text của DIM. Nếu muốn tahy đổi các giá tri này thì các Bạn thay đổi 2 dòng sau:
d1014 (* 3 h_textdim);chieu dai duong dong
d2d (*
4 h_textdim);k/c giua 2 duong kich thuoc


(defun c:sd ( / lstd pt xpt ypt xp yp pt1 goc h_textdim angdim
p10 p11 p13 p14 oldp10 oldp11 oldp13 oldp14)

(defun angdim (ent / pd pc goc1);doan code nay cua Doan Van Ha: Thanks
(setq pd (cdr (assoc 10 (entget (entnext (entnext (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget ent (list "*")))))))))))))
(setq pc (cdr (assoc 10 (entget (entnext (entnext (entnext (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget ent (list "*"))))))))))))))

(if (or (= (getvar "dimtad") 0) (= (getvar "dimtad") 1))
(setq goc1 (angle pd pc))
(setq goc1 (- (angle pd pc) (/ pi 2)))
)
goc1
)

(setq #OSMODE (getvar "OSMODE"))
(command "_.Undo" "be")
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
(princ "\nChon cac DIM can sap xep")
(while (setq lstd (ssget (list(cons 0 "DIMENSION")(cons -4 "<OR")(cons 70 32)(cons 70 33)(cons 70 64)(cons 70 65)(cons 70 128)(cons 70 129)
(cons 70 96)(cons 70 97)(cons 70 160)(cons 70 161)(cons 70 196)(cons 70 197)(cons 70 224)(cons 70 225)(cons -4 "OR>")
;(cons -4 "<OR")(cons 50 0)(cons 50 pi)(cons 50 (/ pi 2))(cons 50 (* 1.5 pi))(cons -4 "OR>")
)
)
)

(setq lstd (vl-remove-if 'listp (mapcar 'cadr (ssnamex lstd))))
(or h_textdim (setq h_textdim (cdr (assoc 140 (tblsearch "DIMSTYLE" (cdr (assoc 3 (entget (car lstd)))))));chieu cao text dim
d1014 (* 3 h_textdim);chieu dai duong dong
d2d (* 4 h_textdim);k/c giua 2 duong kich thuoc
pt (getpoint "\nChon vi tri moi cua chan duong giong kich thuoc")
xpt (car pt)
ypt (cadr pt)
xp xpt
yp ypt
pt1 pt
)
)
(while lstd
(setq en (car lstd)
goc (angdim en)
en (entget en)
oldp10 (cdr(assoc 10 en))
oldp11 (cdr(assoc 11 en))
oldp13 (cdr(assoc 13 en))
oldp14 (cdr(assoc 14 en))
delta_y (- (cadr oldp10)(cadr oldp11))
delta_x (- (car oldp10)(car oldp11))
)
(cond
((= (rem goc pi) 0.0)(setq p13 (list (car oldp13) ypt (caddr oldp13)); DIM ngang
p14 (list (car oldp14) ypt (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (car oldp11) (- (cadr p10) delta_y) (caddr oldp11))
yp (cadr (polar p14 (angle p14 oldp10) d2d))
)
)
((= (rem goc (* pi 0.5)) 0.0)(setq p13 (list xpt(cadr oldp13) (caddr oldp13)); DIM dung
p14 (list xpt (cadr oldp14) (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (- (car p10) delta_x) (cadr oldp11) (caddr oldp11))
xp (car (polar p14 (angle p14 oldp10) d2d))
)
)
(t (if (equal (distance oldp10 oldp14) 0.0 0.00001); DIM nghieng
(progn
(setq p13 (inters (polar oldp13 (+ goc (* pi 0.5)) d1014) oldp13 pt (polar pt goc d1014) nil)
p14 (inters (polar oldp14 (+ goc (* pi 0.5)) d1014) oldp14 pt (polar pt goc d1014) nil); DIM ali
)
)
(progn
(setq p13 (inters (polar oldp13 goc d1014) oldp13 pt (polar pt (+ goc (* pi 0.5)) d1014) nil)
p14 (inters oldp14 oldp10 pt (polar pt (+ goc (* pi 0.5)) d1014) nil)
)
)
)
(setq p10 (polar p14 (angle p14 oldp10) d1014)
p11 (polar oldp11 (angle oldp10 p14) (distance p10 oldp10))
pt1 (polar pt (angle p14 oldp10) d2d)
)
)
);cond

(setq en (subst (cons 13 p13)(assoc 13 en) en)
en (subst (cons 14 p14)(assoc 14 en) en)
en (subst (cons 10 p10)(assoc 10 en) en)
en (subst (cons 11 p11)(assoc 11 en) en)
lstd (cdr lstd)
)
(entmod en)
);for
(princ "\nChon cac DIM can sap xep")
(setq xpt xp ypt yp pt pt1)
);while
(setvar "OSMODE" #OSMODE)
(command "_.Undo" "en")
(princ)
)

  • 1

#2 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 11 September 2012 - 02:35 PM

Đã text thử lisp của bạn, nhưng ko được như ý.
Khi load Dim xong.
Gõ lệnh: sd
Chọn đối tượng: là các Dimension. --->Enter
Chọn vị trí mới của chân đường giống kích thước: pick điểm --->Enter
Kết quả tất cả các Dim mang giá trị 0 và nằm chung 1 chỗ.....
Bạn xem lại nhé.
  • 0

#3 cad2080

cad2080

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 11 September 2012 - 02:57 PM

lisp k ra 1 cái kiểu gì và cũng mất luôn bắt điểm các giá trị dim thì về 0
  • 0

#4 SoftvnBin

SoftvnBin

    biết vẽ ellipse

  • Advance Member
  • PipPip
  • 51 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 11 September 2012 - 03:20 PM

lisp k ra 1 cái kiểu gì và cũng mất luôn bắt điểm các giá trị dim thì về 0

Bạn không nên nói vậy, dù gì thì tien2005 cũng rất nhiệt tình share cho ae dùng và test thử mà, lisp ngon thì liệu tien2005 có được gì không, hay chỉ có mấy bạn load về có lợi thôi, không có những người share như tien2005 liệu bạn sẽ làm kiểu gì (nếu không biết lập trình lisp)
  • 1

#5 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 11 September 2012 - 03:23 PM

Các Bạn thử lại lisp sau

(defun c:sd ( / lstd pt xpt ypt xp yp pt1 goc h_textdim
p10 p11 p13 p14 oldp10 oldp11 oldp13 oldp14)
(setq #OSMODE (getvar "OSMODE"))
(command "_.Undo" "be")
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
(princ "\nChon cac DIM can sap xep")
(while (setq lstd (ssget (list(cons 0 "DIMENSION");"AcDbAlignedDimension" "AcDbRotatedDimension"
(cons -4 "<OR")(cons 70 32)(cons 70 33)(cons 70 64)(cons 70 65)(cons 70 128)(cons 70 129)
(cons 70 96)(cons 70 97)(cons 70 160)(cons 70 161)(cons 70 196)(cons 70 197)(cons 70 224)(cons 70 225)(cons -4 "OR>")
;(cons -4 "<OR")(cons 50 0)(cons 50 pi)(cons 50 (/ pi 2))(cons 50 (* 1.5 pi))(cons -4 "OR>")
)
)
)
(setq lstd (vl-remove-if 'listp (mapcar 'cadr (ssnamex lstd))))
(or h_textdim (setq h_textdim (cdr (assoc 140 (tblsearch "DIMSTYLE" (cdr (assoc 3 (entget (car lstd)))))));chieu cao text dim
d1014 (* 3 h_textdim);k/c tu chan duong giong den duong ghi kich thuoc
d2d (* 4 h_textdim);k/c giua 2 duong kich thuoc
pt (getpoint "\nChon vi tri moi cua chan duong giong kich thuoc")
xpt (car pt)
ypt (cadr pt)
xp xpt
yp ypt
pt1 pt
)
)
(while lstd
(setq en (entget (car lstd))
oldp10 (cdr(assoc 10 en))
oldp11 (cdr(assoc 11 en))
oldp13 (cdr(assoc 13 en))
oldp14 (cdr(assoc 14 en))
goc (angle oldp14 oldp10)
delta_y (- (cadr oldp10)(cadr oldp11))
delta_x (- (car oldp10)(car oldp11))
)
(cond

((= (rem goc pi) 0.0)(setq p13 (list xpt(cadr oldp13) (caddr oldp13)); DIM dung
p14 (list xpt (cadr oldp14) (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (- (car p10) delta_x) (cadr oldp11) (caddr oldp11))
xp (car (polar p14 (angle p14 oldp10) d2d))
)
)
((= (rem goc (* pi 0.5)) 0.0)(setq p13 (list (car oldp13) ypt (caddr oldp13)); DIM ngang
p14 (list (car oldp14) ypt (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (car oldp11) (- (cadr p10) delta_y) (caddr oldp11))
yp (cadr (polar p14 (angle p14 oldp10) d2d))
)
)
(t(setq p13 (inters (polar oldp13 goc d1014) oldp13 pt (polar pt (+ goc (* pi 0.5)) d1014) nil)
p14 (inters oldp14 oldp10 pt (polar pt (+ goc (* pi 0.5)) d1014) nil); DIM ali
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (polar oldp11 (angle oldp10 p14) (distance p10 oldp10))
pt1 (polar pt (angle p14 oldp10) d2d)
)
)
)
(setq en (subst (cons 13 p13)(assoc 13 en) en)
en (subst (cons 14 p14)(assoc 14 en) en)
en (subst (cons 10 p10)(assoc 10 en) en)
en (subst (cons 11 p11)(assoc 11 en) en)
lstd (cdr lstd)
)
(entmod en)
);for
(princ "\nChon cac DIM can sap xep")
(setq xpt xp ypt yp pt pt1)
);while
(setvar "OSMODE" #OSMODE)
(command "_.Undo" "en")
(princ)
)

Lưu ý: các đường DIM nghiêng có điểm dóng (dxf14) nằm trên đường ghi kích thước có nghĩ là không có đường dóng thì sẽ không đúng
lisp ở bài #1 để mình xem lại cách tính góc nghiêng cho chính xác hơn
  • 2

#6 cad2080

cad2080

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 11 September 2012 - 03:53 PM

Các Bạn thử lại lisp sau


(defun c:sd ( / lstd pt xpt ypt xp yp pt1 goc h_textdim
p10 p11 p13 p14 oldp10 oldp11 oldp13 oldp14)
(setq #OSMODE (getvar "OSMODE"))
(command "_.Undo" "be")
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
(princ "\nChon cac DIM can sap xep")
(while (setq lstd (ssget (list(cons 0 "DIMENSION");"AcDbAlignedDimension" "AcDbRotatedDimension"
(cons -4 "<OR")(cons 70 32)(cons 70 33)(cons 70 64)(cons 70 65)(cons 70 128)(cons 70 129)
(cons 70 96)(cons 70 97)(cons 70 160)(cons 70 161)(cons 70 196)(cons 70 197)(cons 70 224)(cons 70 225)(cons -4 "OR>")
;(cons -4 "<OR")(cons 50 0)(cons 50 pi)(cons 50 (/ pi 2))(cons 50 (* 1.5 pi))(cons -4 "OR>")
)
)
)
(setq lstd (vl-remove-if 'listp (mapcar 'cadr (ssnamex lstd))))
(or h_textdim (setq h_textdim (cdr (assoc 140 (tblsearch "DIMSTYLE" (cdr (assoc 3 (entget (car lstd)))))));chieu cao text dim
d1014 (* 3 h_textdim);k/c tu chan duong giong den duong ghi kich thuoc
d2d (* 4 h_textdim);k/c giua 2 duong kich thuoc
pt (getpoint "\nChon vi tri moi cua chan duong giong kich thuoc")
xpt (car pt)
ypt (cadr pt)
xp xpt
yp ypt
pt1 pt
)
)
(while lstd
(setq en (entget (car lstd))
oldp10 (cdr(assoc 10 en))
oldp11 (cdr(assoc 11 en))
oldp13 (cdr(assoc 13 en))
oldp14 (cdr(assoc 14 en))
goc (angle oldp14 oldp10)
delta_y (- (cadr oldp10)(cadr oldp11))
delta_x (- (car oldp10)(car oldp11))
)
(cond

((= (rem goc pi) 0.0)(setq p13 (list xpt(cadr oldp13) (caddr oldp13)); DIM dung
p14 (list xpt (cadr oldp14) (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (- (car p10) delta_x) (cadr oldp11) (caddr oldp11))
xp (car (polar p14 (angle p14 oldp10) d2d))
)
)
((= (rem goc (* pi 0.5)) 0.0)(setq p13 (list (car oldp13) ypt (caddr oldp13)); DIM ngang
p14 (list (car oldp14) ypt (caddr oldp14))
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (list (car oldp11) (- (cadr p10) delta_y) (caddr oldp11))
yp (cadr (polar p14 (angle p14 oldp10) d2d))
)
)
(t(setq p13 (inters (polar oldp13 goc d1014) oldp13 pt (polar pt (+ goc (* pi 0.5)) d1014) nil)
p14 (inters oldp14 oldp10 pt (polar pt (+ goc (* pi 0.5)) d1014) nil); DIM ali
p10 (polar p14 (angle p14 oldp10) d1014)
p11 (polar oldp11 (angle oldp10 p14) (distance p10 oldp10))
pt1 (polar pt (angle p14 oldp10) d2d)
)
)
)
(setq en (subst (cons 13 p13)(assoc 13 en) en)
en (subst (cons 14 p14)(assoc 14 en) en)
en (subst (cons 10 p10)(assoc 10 en) en)
en (subst (cons 11 p11)(assoc 11 en) en)
lstd (cdr lstd)
)
(entmod en)
);for
(princ "\nChon cac DIM can sap xep")
(setq xpt xp ypt yp pt pt1)
);while
(setvar "OSMODE" #OSMODE)
(command "_.Undo" "en")
(princ)
)

Lưu ý: các đường DIM nghiêng có điểm dóng (dxf14) nằm trên đường ghi kích thước có nghĩ là không có đường dóng thì sẽ không đúng
lisp ở bài #1 để mình xem lại cách tính góc nghiêng cho chính xác hơn

à xl b vì m lại hiểu nhầm câu sắp xếp dim thật ra nó là lisp để các dim k bị lệnh nh nhưng sao lisp của b dài thế m dow được lisp họ viết ngắn lắm.b thử xem
http://www.cadviet.c...3/111690_md.lsp
  • 0

#7 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 11 September 2012 - 04:57 PM

@cad2080: 2 lisp này khác nhau Bạn ơi lisp của mình dời cả chân đường dóng và đường ghi kích thước nên các dim sau khi chạy lisp sẽ cách đều nhau và chiều dài đường cũng bằng nhau. Lisp do Bạn đưa lên chỉ dời đường ghi kích thước thôi nên các dim cũng không đều nhau
  • 0

#8 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 12 September 2012 - 10:10 AM

Các Bạn dùng thử lisp này đã khắc phục được lổi ở bài #1 và các DIM không có đường dóng ở bài #5. Nếu chưa ổn thì các Bạn comment để mình khắc phục

(defun c:sd ( / lstd pt xpt ypt xp yp pt1 goc h_textdim dxf50 dxf70
p10 p11 p13 p14 oldp10 oldp11 oldp13 oldp14)
(setq #OSMODE (getvar "OSMODE"))
(command "_.Undo" "be")
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
(princ "\nChon cac DIM can sap xep")
(while (setq lstd (ssget (list(cons 0 "DIMENSION");"AcDbAlignedDimension" "AcDbRotatedDimension"
(cons -4 "<OR")(cons 70 32)(cons 70 33)(cons 70 64)(cons 70 65)(cons 70 128)(cons 70 129)
(cons 70 96)(cons 70 97)(cons 70 160)(cons 70 161)(cons 70 192)(cons 70 193)(cons 70 224)(cons 70 225)(cons -4 "OR>")
;(cons -4 "<OR")(cons 50 0)(cons 50 pi)(cons 50 (/ pi 2))(cons 50 (* 1.5 pi))(cons -4 "OR>")
)
)
)
(setq lstd (vl-remove-if 'listp (mapcar 'cadr (ssnamex lstd))))
(or h_textdim (setq h_textdim (cdr (assoc 140 (tblsearch "DIMSTYLE" (cdr (assoc 3 (entget (car lstd)))))));chieu cao text dim
d1014 (* 3 h_textdim);c/dai duong dong
d2d (* 4 h_textdim);k/c giua 2 duong kich thuoc
pt (getpoint "\nChon vi tri moi cua chan duong giong kich thuoc")
xpt (car pt)
ypt (cadr pt)
xp xpt
yp ypt
pt1 pt
)
)
(while lstd
(setq en (entget (car lstd))
oldp10 (cdr(assoc 10 en))
oldp11 (cdr(assoc 11 en))
oldp13 (cdr(assoc 13 en))
oldp14 (cdr(assoc 14 en))
goc (angle oldp14 oldp13)
dxf50 (cdr(assoc 50 en))
dxf70 (rtos(cdr(assoc 70 en))2 0)
)

(cond
((or
(and (wcmatch dxf70 "32,64,128,96,160,192,224")(= (rem dxf50 pi) 0.0))
(and (not(wcmatch dxf70 "32,64,128,96,160,192,224"))(= (rem goc pi) 0.0))
)

(setq p13 (list (car oldp13) ypt (caddr oldp13)); DIM ngang
p14 (list (car oldp14) ypt (caddr oldp14))
yp (cadr (polar p14 (angle p14 oldp10) d2d))
)
)
((or
(and (wcmatch dxf70 "32,64,128,96,160,192,224")(= (rem dxf50 (* pi 0.5)) 0.0))
(and (not(wcmatch dxf70 "32,64,128,96,160,192,224"))(= (rem goc (* pi 0.5)) 0.0))
)
(setq p13 (list xpt(cadr oldp13) (caddr oldp13)); DIM dung
p14 (list xpt (cadr oldp14) (caddr oldp14))
xp (car (polar p14 (angle p14 oldp10) d2d))
)
)

(t(setq p13 (inters (polar oldp13 (+ goc (* pi 0.5)) d1014) oldp13 pt (polar pt goc d1014) nil)
p14 (inters (polar oldp14 (+ goc (* pi 0.5)) d1014) oldp14 pt (polar pt goc d1014) nil)
pt1 (polar pt (angle p14 oldp10) d2d)
)
)
)
(setq p10 (polar p14 (angle p14 oldp10) d1014)
p11 (polar oldp11 (angle oldp10 p14) (distance p10 oldp10))
en (subst (cons 13 p13)(assoc 13 en) en)
en (subst (cons 14 p14)(assoc 14 en) en)
en (subst (cons 10 p10)(assoc 10 en) en)
en (subst (cons 11 p11)(assoc 11 en) en)
lstd (cdr lstd)
)
(entmod en)
);while lstd
(princ "\nChon cac DIM can sap xep")
(setq xpt xp ypt yp pt pt1)
);while
(setvar "OSMODE" #OSMODE)
(command "_.Undo" "en")
(princ)
)

  • 2