Đến nội dung


Hình ảnh
- - - - -

help_ lisp thu hẹp khoảng cách giữa đường kthước và đg được ghi kthước


  • Please log in to reply
11 replies to this topic

#1 amateurday

amateurday

    biết lệnh break

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

Đã gửi 02 January 2010 - 02:26 PM

các bác viết júp em lisp này: lisp thu hẹp (và kéo giãn hàng loạt) khoảng cách giữa đường kthước và đường được ghi kthước. theo 1 khoảng cách cho trước
  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 January 2010 - 03:42 PM

các bác viết júp em lisp này: lisp thu hẹp (và kéo giãn hàng loạt) khoảng cách giữa đường kthước và đường được ghi kthước. theo 1 khoảng cách cho trước

Chịu. Bạn viết khó hiểu quá.
Thế nào là đường kthước??? và thế nào là đường được ghi kthước?????
thu hẹp (và kéo giãn hàng loạt) theo điểm chuẩn nào???

Bạn có thể nói rõ hơn? Tue_NV nghĩ rằng bạn nên upload minh họa điều bạn nói qua file .dwg
  • 1

#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 January 2010 - 05:01 PM

các bác viết júp em lisp này: lisp thu hẹp (và kéo giãn hàng loạt) khoảng cách giữa đường kthước và đường được ghi kthước. theo 1 khoảng cách cho trước

Nếu đường kich thước là đường gióng, và đường được ghi kích thước là đường kích thước thì trên diễn đàn đã có lisp rồi bạn ạ, hãy chịu khó tìm kiếm nha.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 amateurday

amateurday

    biết lệnh break

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

Đã gửi 02 January 2010 - 05:23 PM

em muốn hình bên trái biến thành hình bên phải. vì cần phải thao tác với nhiều đối tượng nằm lung tung trên bản vẽ nên nếu làm thủ công thì "bó tay lun"
Hình đã gửi
  • 0

#5 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 02 January 2010 - 10:46 PM

em muốn hình bên trái biến thành hình bên phải. vì cần phải thao tác với nhiều đối tượng nằm lung tung trên bản vẽ nên nếu làm thủ công thì "bó tay lun"
Hình đã gửi

Dưới đây là Lisp do Nguyen Hoanh viết:
+ Đánh lệnh SD
+ Pick dim 800 trước (trục X)
+ Select các dim khác theo trục X
+ Dùng lệnh Stretch để dời các dim gần Object
Thực hiện các bước như trên cho các dim theo trục Y
Amateurday nên dùng chức năng Tìm kiếm của cadviet.com http://www.cadviet.c...search.php#1233

http://www.cadviet.c...d_sapxepdim.lsp

P/s: Sẽ có dòng "Unknown command "SD". Press F1 for help" sau khi Chon duong dim goc. Nhưng Lisp vẫn chạy OK.
  • 1

#6 amateurday

amateurday

    biết lệnh break

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

Đã gửi 03 January 2010 - 12:59 AM

Dưới đây là Lisp do Nguyen Hoanh viết:
+ Đánh lệnh SD
+ Pick dim 800 trước (trục X)
+ Select các dim khác theo trục X
+ Dùng lệnh Stretch để dời các dim gần Object
Thực hiện các bước như trên cho các dim theo trục Y
Amateurday nên dùng chức năng Tìm kiếm của cadviet.com http://www.cadviet.c...search.php#1233

http://www.cadviet.c...d_sapxepdim.lsp

P/s: Sẽ có dòng "Unknown command "SD". Press F1 for help" sau khi Chon duong dim goc. Nhưng Lisp vẫn chạy OK.


thank bác phi, nhưg lisp này có 2 nhược điểm:
+ không dùng đc cho cad2008, bác hoanh có nói cad08 có lisp tương tự nhưg em ko biết là lips nào
+ không tự chọn khoảng cách theo ý mình đc, bác hoanh có bảo xem các reply, nhưg em xem cũng ko thấy cách nào, vì em ko hiểu rõ về lips lắm
bác phi hay bác nào hoàn thiện 2 yêu cầu trên júp em đc ko.
  • 0

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 January 2010 - 02:38 PM

Dưới đây là Lisp do Nguyen Hoanh viết:
+ Đánh lệnh SD
+ Pick dim 800 trước (trục X)
+ Select các dim khác theo trục X
+ Dùng lệnh Stretch để dời các dim gần Object
Thực hiện các bước như trên cho các dim theo trục Y
......
http://www.cadviet.c...d_sapxepdim.lsp

Chào bạn amateurdayPhiphi
Nhìn vào hình ảnh mà amateurday đã upload ta có thể thấy rằng amateurday muốn co giãn hoặc thu hẹp các DIMENSION theo 1 đường chuẩn nào đó, cụ thể đường chuẩn của DIM theo phương X là đường nằm trên cùng, đường chuẩn của DIM theo phương Y là đường nằm bên trái,
trong khi đó lisp của bác Hoành co giãn và thu hẹp theo 1 DIMENSION chuẩn nào đó.

Mạn phép bác Nguyễn Hoành, Tue_NV sửa lại Lisp của bác đôi chút cho phù hợp với yêu cầu của bạn amateurday và đôi khi các bạn khác cũng cần sử dụng đến
Lisp này co giãn hoặc thu hẹp các DIM theo 1 đường chuẩn do User chọn bằng việc Pick 2 điểm

Command: sd
Sap xep dim © CADViet.com
Chon diem goc : -> chọn điểm chuẩn đầu tiên
Chon 1 diem theo phuong : -> hiện chế độ Ortho, Nếu bạn muốn co giãn hay thu hẹp DIM theo phương nào thì kéo chuột theo phương đó và ...Pick

Select objects: Specify opposite corner: 3 found -> Chọn đối tượng DIM cần co giãn hoặc thu hẹp

Select objects: -> Enter

Khoang cach Dim goc < 7.77 > : Chọn khoảng cách co giãn hoặc thu hẹp DIM bằng cách nhập từ bàn phím hoặc bằng cách pick điểm. Với cách chọn khoảng cách bằng cách pick điểm thì Lisp đã chọn cho mình trước 1 điểm chuẩn rồi, mình chỉ còn chọn điểm thứ 2 nữa mà thôi. Khoảng cách giữa 2 điểm này là khoảng cách.
Và khoảng cách được lưu lại cho các lần nhập về sau. Đồng ý thì Enter, không đồng ý thì nhập khoảng cách mới bằng cách nhập từ bàn phím hoặc bằng cách pick điểm

Đay là Code của bác Hoành đã được chỉnh lại theo ý của amateurday.
Các bạn sử dụng thử nhé :

(defun c:sd (/ p p2 entgoc ttgoc p13goc goc heightdimgoc ssd lstd
lstlevel lstam lstduong lstamtmp lstduongtmp plht
kcdimht khoangcachdim pgoc duongthu diemchenht pmoi)
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (cond
(ss (sslength ss))
(t 0)
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
(defun hoanh_newerror (msg)
(if (and (/= msg "Function cancelled")
(/= msg "quit / exit abort")
)
(princ (strcat "\n" msg))
)
(done)
)
;;----------
(defun init ()
(setq
HOANH_CMD (getvar "CMDECHO")
HOANH_OLDERROR *error*
*error* hoanh_newerror

)
(setvar "CMDECHO" 0)
(command ".undo" "BE")
)
;;----------
(defun done ()
(command ".redraw")
(command ".undo" "E")
(if HOANH_CMD
(setvar "CMDECHO" HOANH_CMD)
)
(if HOANH_OLDERROR
(setq *error* HOANH_OLDERROR)
)
(princ)
)
;;----------

(defun cdim (entdt pchan pduong / tt old10
old13 old14 new10 new13 new14 p10n
p13n p14n p10o p13o p14o gocduong
gocchan pchanb pduongb loaidim
)
(defun chanvuonggoc (ph p1 p2 / ptemp pkq goc)
(setq
goc (+ (angle p1 p2) (/ pi 2.0))
ptemp (polar ph goc 1000.0)
pkq (inters ph ptemp p1 p2 nil)
)
pkq
)
(setq
tt (entget entdt)
old10 (assoc '10 tt)
old13 (assoc '13 tt)
old14 (assoc '14 tt)
p10o (cdr old10)
p13o (cdr old13)
p14o (cdr old14)
loaidim (logand (cdr (assoc '70 tt)) 7)
gocduong (cond
((= loaidim 1) (angle p13o p14o))
((= loaidim 0) (cdr (assoc '50 tt)))
(t nil)
)
pchan (cond
(pchan (list (car pchan) (cadr pchan) 0.0))
(t pchan)
)
pduong (cond
(pduong (list (car pduong) (cadr pduong) 0.0))
(t pduong)
)

)
(if gocduong
(progn
(if pchan
(setq
pchanb (polar pchan gocduong 1000.0)
p13n (chanvuonggoc
(list (car p13o) (cadr p13o) 0.0)
pchan
pchanb
)
p14n (chanvuonggoc
(list (car p14o) (cadr p14o) 0.0)
pchan
pchanb
)
new13 (cons 13 p13n)
new14 (cons 14 p14n)
tt (subst new13 old13 tt)
tt (subst new14 old14 tt)
)
)
(if pduong
(setq
pduongb (polar pduong gocduong 1000.0)
p10n (chanvuonggoc
(list (car p10o) (cadr p10o) 0.0)
pduong
pduongb
)
new10 (cons 10 p10n)
tt (subst new10 old10 tt)
)
)
(entmod tt)
)
)
gocduong
)

(defun textdimheight (ent / tmp)
(command ".copy" ent "" (list 0.0 0.0 0.0) "@")
(command ".explode" (entlast) "")
(setq tmp (cdr (assoc 40 (entget (entlast)))))
(command ".erase" "p" "")
tmp
)
(defun phia (p1 p2 p3 / x1 y1 z1 x2 y2 z2 x3 y3 z3)
(setq
x1 (car p1)
y1 (cadr p1)
z1 (caddr p1)
x2 (car p2)
y2 (cadr p2)
z2 (caddr p2)
x3 (car p3)
y3 (cadr p3)
z3 (caddr p3)
tmp (+ (* (- x1 x2) x3)
(* (- y1 y2) y3)
(* (- z1 z2) z3)
)
)
(cond
((= tmp 0.0) 0.0)
(t (/ tmp (abs tmp)))
)
)
(defun khoangcachdim (p1 ent goc / tt p2 A B D)
(setq tt (entget ent)
p2 (cdr (assoc 10 tt))
B (cdr (assoc 50 tt))
A (angle p1 p2)
D (distance p1 p2)
)
(* (* D (sin (- A B ))) (phia p1 (polar p1 goc 1.0) p2))
)

(defun phanloai (ent)
(setq
kc (khoangcachdim pgoc ent goc)
loai (fix (/ kc heightdimgoc 0.93))
)
(cons loai ent)
)

(init)
(princ "\nSap xep dim © CADViet.com")
(setq p (getpoint "\n Chon diem goc :"))
(setvar "orthomode" 1)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p2 (getpoint p "\n Chon 1 diem theo phuong :"))
(command "dimlinear" p p2 p)
;(while (not (setq entgoc (car (entsel "\nChon duong dim goc: "))))
:cheers:
(setq entgoc (entlast))

(setq ttgoc (entget entgoc))
(setq p13goc (cdr (assoc 13 ttgoc))
pgoc (cdr (assoc 10 ttgoc))
goc (cdr (assoc 50 ttgoc))
heightdimgoc (textdimheight entgoc) )
(entdel entgoc)
(setq ssd (ssget (list
(cons 0 "DIMENSION")
(cons -4 "(cons 70 32)
(cons 70 64)
(cons 70 96)
(cons 70 128)
(cons 70 160)
(cons 70 196)
(cons 70 224)
(cons -4 "OR>")
(cons -4 "(cons 50 goc)
(cons 50 (+ goc pi))
(cons 50 (- goc pi))
(cons -4 "OR>")
)
)
lstd (ss2ent ssd)
lstd (mapcar 'phanloai lstd)
lstlevel nil
)

(foreach pp lstd
(if (not (member (car pp) lstlevel))
(setq lstlevel (append lstlevel (list (car pp))))
)
)
(setq lstlevel (vl-sort lstlevel '(lambda (x1 x2) (< x1 x2)))
lstam nil
lstduong nil
lstamtmp nil
lstduongtmp nil
)
(foreach pp lstlevel
(if (< pp 0.0)
(setq lstam (append lstam (list pp)))
)
(if (> pp 0.0)
(setq lstduong (append lstduong (list pp)))
)
)
(setq index 0)
(foreach pp (reverse lstam)
(setq
index (1+ index)
lstamtmp (append lstamtmp (list (cons pp index)))
)
)
(setq
lstam lstamtmp
index 0
)
(foreach pp lstduong
(setq
index (1+ index)
lstduongtmp (append lstduongtmp (list (cons pp index)))
)
)
(setq lstduong lstduongtmp)
(setq lstlevel (append lstduong lstam (list (cons 0.0 0))))

;(setq kcdimstandard (* 3.0 heightdimgoc))
(if (not *kcdim*) (setq *kcdim* (* 2.0 heightdimgoc)) )
(setq kcdimstandard (getdist p (strcat "\n Khoang cach Dim goc < " (rtos *kcdim* 2 2) " > :")))
(if (not kcdimstandard) (setq kcdimstandard *kcdim*) (setq *kcdim* kcdimstandard) )
(foreach pp lstd
(setq plht (car pp))
(progn
(setq
kcdimht (khoangcachdim pgoc (cdr pp) goc)
duongthu (cdr (assoc plht lstlevel))
heso (cond
((/= 0 kcdimht)
(abs (* (/ kcdimstandard kcdimht) duongthu))
)
(t 0.0)
)
diemchenht (cdr (assoc 10 (entget (cdr pp))))
pmoi (polar pgoc
(angle pgoc diemchenht)
(* heso (distance pgoc diemchenht))
)
)

(cdim (cdr pp) p13goc pmoi)
)
)
(done)
(setvar "osmode" oldos)
)
(princ "\nSap xep dim, SD - free lisp from www.cadviet.com")
(princ)

Bài viết đã được chỉnh sửa nội dung bởi Tue_NV: 03 January 2010 - 03:02 PM

  • 2

#8 amateurday

amateurday

    biết lệnh break

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

Đã gửi 03 January 2010 - 03:16 PM

cám ơn bác TUE_NV, nhưg nó không dùng đc cho cad08 phải không vì em làm theo chỉ dẫn nó ra thế này:
Command: sd
Sap xep dim © CADViet.com
Chon diem goc : -> chọn điểm chuẩn đầu tiên
Chon 1 diem theo phuong : -> hiện chế độ Ortho, Nếu bạn muốn co giãn hay thu hẹp DIM theo phương nào thì kéo chuột theo phương đó và ...Pick

sau đó nó ra cái dưới luôn, không cho chọn đối tượng:

Khoang cach Dim goc < 7.77 > :

sau đó là thoát lênh luôn, bác Tue_NV à

kết quả cuối cùng đây bác:

Command: SD
Sap xep dim © CADViet.com
Chon diem goc :
Chon 1 diem theo phuong :Unknown command "SD". Press F1 for help.
Khoang cach Dim goc < 50.00 > :
  • 0

#9 amateurday

amateurday

    biết lệnh break

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

Đã gửi 03 January 2010 - 11:16 PM

bác nào vào júp em cái này đi, thanks
  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 04 January 2010 - 08:28 AM

cám ơn bác TUE_NV, nhưg nó không dùng đc cho cad08 phải không vì em làm theo chỉ dẫn nó ra thế này:
Command: sd
Sap xep dim © CADViet.com
Chon diem goc : -> chọn điểm chuẩn đầu tiên
Chon 1 diem theo phuong : -> hiện chế độ Ortho, Nếu bạn muốn co giãn hay thu hẹp DIM theo phương nào thì kéo chuột theo phương đó và ...Pick

sau đó nó ra cái dưới luôn, không cho chọn đối tượng:

Khoang cach Dim goc < 7.77 > :

sau đó là thoát lênh luôn, bác Tue_NV à

kết quả cuối cùng đây bác:

Command: SD
Sap xep dim © CADViet.com
Chon diem goc :
Chon 1 diem theo phuong :Unknown command "SD". Press F1 for help.
Khoang cach Dim goc < 50.00 > :

Chức năng Download Lisp file của diễn đàn bị lỗi.
'amateurday' sử dụng Code được upload ở file dưới đây về chạy thử nhé :

http://www.cadviet.c...pfiles/2/sd.lsp

Chúc thành công nhé :cheers:
  • 1

#11 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 04 January 2010 - 08:48 AM

thank bác phi, nhưg lisp này có 2 nhược điểm:
+ không dùng đc cho cad2008, bác hoanh có nói cad08 có lisp tương tự nhưg em ko biết là lips nào
+ không tự chọn khoảng cách theo ý mình đc, bác hoanh có bảo xem các reply, nhưg em xem cũng ko thấy cách nào, vì em ko hiểu rõ về lips lắm
bác phi hay bác nào hoàn thiện 2 yêu cầu trên júp em đc ko.

Trích lời bác Hòanh : Không ngờ, ACAD 2008 đã có sẵn lệnh này với cái tên là DIMSPACE.
Tham khảo : http://www.cadviet.c...?showtopic=1661

Vấn đề của bạn Tui đã trả lời ở đây : http://www.cadviet.c...o...ost&p=81433
  • 1

#12 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 12 July 2010 - 03:18 PM

Chức năng Download Lisp file của diễn đàn bị lỗi.
'amateurday' sử dụng Code được upload ở file dưới đây về chạy thử nhé :

http://www.cadviet.c...pfiles/2/sd.lsp

Chúc thành công nhé :D

Vài ý kiến về lệnh sd
1. Thay (command ".explode" (entlast) "")
thành (command ".explode" (entlast)) sẽ hết thông báo lỗi Unknown command "SD"
2. Khoảng cách default giữa các dim lấy = 2 lần chiều cao text, khoảng cách này có thể khác với khoảng cách khi dùng lệnh dimbaseline
Đối với dimstyle hiện hành, giá trị này bằng
(* (getvar "DIMSCALE") (getvar "DIMDLI"))
Đối với dimstyle của dim được chọn làm dim gốc tính như sau
(defun BaselineSpacing ( ent / el)
(setq el (tblsearch "DIMSTYLE" (cdr (assoc 3 (entget ent)))))
(* (cdr(assoc 40 el)) (cdr(assoc 43 el)))
)
3. Trường hợp vị trí text của dim đã thay đổi , sau khi sắp xếp sẽ không đúng.
4. Dùng lệnh ".explode" tuy đơn giản nhưng có thể không an toàn, trong chương trình này thì không sao, nhưng nếu có lỗi xảy ra sẽ sinh ra rác.
Ngoài ra, nếu chọn dim thì có thể xảy ra các trường hợp sau
1. dim có text move vào nằm giữa dimline, (entlast) không phải là mtext mà là các mũi tên
2. dim có text là " " (blank) sẽ không có mtext
Có thể truy xuất đối tượng mtext của dim thông qua block
(nil nếu dim không có mtext)
(defun GetMtextDim (en / ei ed)
(if(setq ei (cdr(assoc 2 (entget en))))
(progn
(setq ei (cdr(assoc -2 (tblsearch "BLOCK" ei))))
(while (and ei (not ed))
(if (= "MTEXT" (cdr(assoc 0 (entget ei))) )(setq ed ei))
(setq ei (entnext ei))
)
))
ed
)

  • 0