Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#1021 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 04 April 2010 - 09:46 PM

xin chào các bác pro!
Em có một yêu cầu nhỏ mong các bác giúp đỡ là các bác có thể viết giúp em một lisp có thể sửa hàng loạt các mtext để cho các mtext có cùng một nội dung như khi mình chỉnh text được không?!Ví dụ: khi mình bôi chọn 10 đối tượng text thì khi mở bảng properties ở dòng content mình nhập nội dung thì cả 10 text đều thay đổi với cùng một nội dung nhưng với mtext thì mình lại phải thay đổi đánh lại 10 lần như vậy thật bất tiện so với text. Rất mong các bác giúp đỡ! Xin cảm ơn các bác nhiều

Đây là Lisp code
(defun c:ChangeAllText()
(setq DCL_ID (load_dialog "ChangeAllText.DCL"))
(new_dialog "InputBox" DCL_ID)
(action_tile "txt" "(setq Txt $value)")
(setq Answ (start_dialog))
(if (= Answ 1)
(progn
(setq ss (ssget '((-4 . "")))
I -1)
(while (setq Ent (ssname ss (setq I (1+ I))))
(setq Ent (entget ent)
Ent (subst (cons 1 txt) (assoc 1 ent) ent))
(entmod ent)
)
)
)
)
Lưu DCL code sau đây thành 1 file có tên "ChangeAllText.DCL" và đặt file vào đường dẫn hôc trợ của Cad. Sở dĩ tôi dùng Dialog để thuận tiện cho việc nhập chuỗi vì việc nhập chuỗi trên dòng lệnh không được thuận tiện lắm.
InputBox: dialog{
label = "Nhâòp giaì triò";
initial_focus = "txt";
:text {label="HaÞy nhâòp giaì triò câÌn thay ðôÒi:";}
:edit_box { fixed_width = true;
key = "txt"; edit_width = 30; allow_accept=true;}
ok_cancel;}

  • 1

#1022 mrmoon273

mrmoon273

    biết pan

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

Đã gửi 05 April 2010 - 04:42 PM

Chào các bác...

em có yêu cầu nho nhỏ mong các bác giúp đỡ. Cái này có vẻ đơn giản, nhưng trong công việc của em lại mất khá nhiều thời gian để thực hiện. Cụ thể như thế này ạ : Trong thiết kế chiếu sáng, đèn cho 1 phòng sẽ đc đặt như sau, khoảng cách từ đèn đến tường bằng 1/2 khoảng cách giữa các đèn. Diện tích phòng được xác định 2 góc chéo hcn, số hàng, số cột của đèn đã xác định được rồi. Vậy các bác có thể giúp em tạo 1 lisp giống như lệnh array, nhưng thay cái offset distance and direction bằng chọn diện tích phòng đó, rồi tự tính toán để đặt các block theo hàng và cột nhập vào.
Các bác xem thêm file gửi kèm giúp em nhé
Many thanks.
http://www.cadviet.c..._theo_phong.dwg
  • 0

#1023 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 05 April 2010 - 08:16 PM

Chào các bác...

em có yêu cầu nho nhỏ mong các bác giúp đỡ. Cái này có vẻ đơn giản, nhưng trong công việc của em lại mất khá nhiều thời gian để thực hiện. Cụ thể như thế này ạ : Trong thiết kế chiếu sáng, đèn cho 1 phòng sẽ đc đặt như sau, khoảng cách từ đèn đến tường bằng 1/2 khoảng cách giữa các đèn. Diện tích phòng được xác định 2 góc chéo hcn, số hàng, số cột của đèn đã xác định được rồi. Vậy các bác có thể giúp em tạo 1 lisp giống như lệnh array, nhưng thay cái offset distance and direction bằng chọn diện tích phòng đó, rồi tự tính toán để đặt các block theo hàng và cột nhập vào.
Các bác xem thêm file gửi kèm giúp em nhé
Many thanks.
http://www.cadviet.c..._theo_phong.dwg

Bạn dùng thử xem:

(defun C:BTD( / p1 p2 e m n w h x y p0 d) ;;;Bo Tri Den
(prompt "\nChon 2 diem xac dinh can phong...")
(setq
p1 (getpoint "\nDiem goc duoi ben trai:")
p2 (getcorner p1 "\nDiem goc tren ben phai:")
e (car (entsel "\nChon block:"))
m (getint "\nSo hang:")
n (getint "\nSo cot:")
w (- (car p2) (car p1))
h (- (cadr p2) (cadr p1))
x (/ w n)
y (/ h m)
p0 (list (+ (car p1) (/ x 2)) (+ (cadr p1) (/ y 2)))
p0 (trans p0 1 0)
d (entget e)
d (subst (cons 10 p0) (assoc 10 d) d)
)
(entmod d)
(command "array" e "" "r" m n y x)
(princ)
)

Bạn insert trước cái block đèn ở vị trí bất kỳ (để có cái mà select), nhập lệnh BTD và đáp ứng các yêu cầu...
  • 1

#1024 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 April 2010 - 08:56 PM

Chào các bác...

em có yêu cầu nho nhỏ mong các bác giúp đỡ. Cái này có vẻ đơn giản, nhưng trong công việc của em lại mất khá nhiều thời gian để thực hiện. Cụ thể như thế này ạ : Trong thiết kế chiếu sáng, đèn cho 1 phòng sẽ đc đặt như sau, khoảng cách từ đèn đến tường bằng 1/2 khoảng cách giữa các đèn. Diện tích phòng được xác định 2 góc chéo hcn, số hàng, số cột của đèn đã xác định được rồi. Vậy các bác có thể giúp em tạo 1 lisp giống như lệnh array, nhưng thay cái offset distance and direction bằng chọn diện tích phòng đó, rồi tự tính toán để đặt các block theo hàng và cột nhập vào.
Các bác xem thêm file gửi kèm giúp em nhé
Many thanks.
http://www.cadviet.c..._theo_phong.dwg

Chưa cần sử dụng đến Lisp. Hãy cho mình toạ độ của 1 block hình tròn ở 1 góc bất kì của hình chữ nhật và khoảng cách theo phương X và phương Y của 2 cọc gần nhất. Hoặc là cho toạ độ của 1 block hình tròn ở 1 góc bất kì của hình chữ nhật và các giá trị a, b, m, n

Chỉ bằng lệnh Copym nằm trong phụ trợ Express CAD sẽ giải quyết trọn vấn đề của bạn
  • 0

#1025 quangthiem_xd

quangthiem_xd

    Chưa sử dụng CAD

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

Đã gửi 05 April 2010 - 09:27 PM

bác nào có lisp vẽ mái dốc theo hệ số mái dốc ko up lên cái
  • 0

#1026 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 05 April 2010 - 10:00 PM

Trong Express tools của AutoCAD có CHSPACE.LSP.
Lisp này (lệnh CHSPACE) dùng để MOVE khung tên và những gì User chọn trong Paper Space sang Model Space với tỷ lệ do User muốn.
Nhờ các Bác viết giúp Lisp với mục đích ngược với CHSPACE.LSP:
+ Đánh tên lệnh trong model, select block khung tên
+ Lisp sẽ move block khung tên trong model space sang Paper space với tỷ lệ của User chọn.
+ Tự động tạo 1 viewport bên trong khung tên.
PP up 2 bản vẽ để test.
Cám ơn nhiều
http://www.cadviet.c...el_2_layout.zip
http://www.cadviet.c...s/2/chspace.lsp


Phiphi nên cho lại ví dụ khác hoặc cho thêm thông tin, vì 2 file bạn upload không tạo nên một điển hình: chương trình lisp không biết lấy pline (clip) của viewport ở đâu bên model.
  • 0

#1027 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 05 April 2010 - 11:00 PM

Cám ơn bạn nhé, nếu có các đường line kẻ thành bảng thì tốt qua, thanks

Chào bạn vtd_xd,
Việc kẻ bảng này không khó lắm. Bạn hãy bổ sung vào lisp trên đoạn code sau :

(setq p1 (list (- (car p) (* 0.1 d)) (- (cadr p) (* 0.5 h))))
(command "rectang" p1 (list (+ (car p1) d) (- (cadr p1) (* 2 h))))
(setq en (entlast))
(command "array" en "" "r" k 4 (- (* 2 h)) d)


Thêm vào trước dòng code (command "undo" "e") và sau dòng code (setq k (1+k)))
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1028 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 06 April 2010 - 12:31 AM

Chào các bác...

em có yêu cầu nho nhỏ mong các bác giúp đỡ. Cái này có vẻ đơn giản, nhưng trong công việc của em lại mất khá nhiều thời gian để thực hiện. Cụ thể như thế này ạ : Trong thiết kế chiếu sáng, đèn cho 1 phòng sẽ đc đặt như sau, khoảng cách từ đèn đến tường bằng 1/2 khoảng cách giữa các đèn. Diện tích phòng được xác định 2 góc chéo hcn, số hàng, số cột của đèn đã xác định được rồi. Vậy các bác có thể giúp em tạo 1 lisp giống như lệnh array, nhưng thay cái offset distance and direction bằng chọn diện tích phòng đó, rồi tự tính toán để đặt các block theo hàng và cột nhập vào.
Các bác xem thêm file gửi kèm giúp em nhé
Many thanks.
http://www.cadviet.c..._theo_phong.dwg

Chào bạn mrmoon273,
Mình viết cái lisp này xong mới biết bác SSG đã viết rồi, tuy vậy mình vẫn gửi để bạn tham khảo. Cả lisp của mình và của bác SSG đều chỉ đúng khi cái insert point của block đèn của bạn trùng với tâm của block. Trong trường hợp cái insert point của bạn lệch tâm thì bạn cần xác định khoảng lệch tâm này và hiệu chỉnh nó lại bằng lệnh move co phù hợp bạn nhé.
Lisp của mình đây:

(defun c:btd ()
(command "undo" "be")
(setq p (getpoint "\n Chon goc trai duoi")
p1 (getpoint "\n Chon goc phai tren")
a (abs (- (car p1) (car p)))
b (abs (- (cadr p1) (cadr p)))
m (getint "\n Nhap so hang den: ")
n (getint "\n Nhap so day den: ")
bd (entsel "\n Chon block den")
pd (cdr (assoc 10 (entget (car bd))))
p0 (list (+ (car p) (/ a 2 n)) (+ (cadr p) (/ b 2 m)))
pd (trans pd 0 1))
(command "copy" bd "" pd p0 )
(setq en (entlast))
(command "array" en "" "r" m n (/ b m) (/ a n))
(command "undo" "e")
(princ)
)


Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1029 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 06 April 2010 - 02:55 PM

Phiphi nên cho lại ví dụ khác hoặc cho thêm thông tin, vì 2 file bạn upload không tạo nên một điển hình: chương trình lisp không biết lấy pline (clip) của viewport ở đâu bên model.

Cám ơn bác Nguyen Hoanh.
Vì khung tên của mỗi cty một kiểu nên để đơn giản hoá, bác cứ lấy khổ giấy của layout làm thành 1 viewport hoặc cứ lấy boundary bên trong khung tên.
Thật ra, khi bản vẽ đã trình bày hết trong model thì tất cả các chi tiết cũng đều bố trí bên trong khung tên rồi. Điều chính yếu là Lisp tính toán scale của cái khung tên bên model sao cho fit với khổ giấy A1 hoặc A3 (phổ biến) trong khi chuyển đổi.
  • 0

#1030 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

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

Đã gửi 06 April 2010 - 03:37 PM

Mình đang tìm cách truy xuất dữ liệu của đối tượng trong một block. Giả sử trong block có một hình chữ nhật nằm trong layer "1", một hình chữ nhật khác nằm trong layer "2". Thông qua lisp, làm thế nào biết được tọa độ của hai hình chữ nhật đó trong bản vẽ.
Bạn nào biết vấn đề này xin hướng dẫn, cám ơn nhiều.

Ồ, sao kg có bạn nào góp ý hết nhỉ. chẳng lẽ kg có bạn nào đụng phải vđ này nhỉ. Về vđ này mình cũng đang cố gắng nhưng vì kiến thức vl của mình kém nên kg vận dụng đc (mình chỉ biết autolisp thôi). Tuy nhiên, mình nghỉ vđ này sẽ có thể giải quyết được vì cad từ r2000 trở lên đã cho hiệu chỉnh block (lúc này block đã trở thành một bv, mình có thể sd lisp như đối với bv). Có lẽ vđ này phải có hàm mở đối tượng là block thay vì là bản vẽ mới giải quyết đc. Tuy nhiên, mình kg biết những hàm như thế trên vl. Các cao thủ nào rành về vl có thể hỗ trợ mình đc chăng. Cũng có thể vđ này đã đc giải quyết nhẹ nhàng hơn nhưng mình kg biết, xin chỉ điểm
  • 0

#1031 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 06 April 2010 - 04:40 PM

Ồ, sao kg có bạn nào góp ý hết nhỉ. chẳng lẽ kg có bạn nào đụng phải vđ này nhỉ. Về vđ này mình cũng đang cố gắng nhưng vì kiến thức vl của mình kém nên kg vận dụng đc (mình chỉ biết autolisp thôi). Tuy nhiên, mình nghỉ vđ này sẽ có thể giải quyết được vì cad từ r2000 trở lên đã cho hiệu chỉnh block (lúc này block đã trở thành một bv, mình có thể sd lisp như đối với bv). Có lẽ vđ này phải có hàm mở đối tượng là block thay vì là bản vẽ mới giải quyết đc. Tuy nhiên, mình kg biết những hàm như thế trên vl. Các cao thủ nào rành về vl có thể hỗ trợ mình đc chăng. Cũng có thể vđ này đã đc giải quyết nhẹ nhàng hơn nhưng mình kg biết, xin chỉ điểm

Chào TRUNGNGAMY, Lisp sẽ đưa ra 1 list các ename các đối tượng chứa trong block. Bạn tiếp tục khai thác nhé:
(defun c:exp (/ en obj objarr lstent)
(setq en (car (entsel "\nPick a block:")))
(setq obj (vlax-ename->vla-object en))
(setq objarr (vla-Explode obj)
lstobj (vlax-safearray->list
(vlax-variant-value objarr)
)
)
(setq lstent (mapcar 'vlax-vla-object->ename lstobj))
(princ lstent)
)

  • 3

#1032 queen2k8

queen2k8

    biết pan

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

Đã gửi 06 April 2010 - 08:12 PM

Chào TRUNGNGAMY, Lisp sẽ đưa ra 1 list các ename các đối tượng chứa trong block. Bạn tiếp tục khai thác nhé:

(defun c:exp (/ en obj objarr lstent)
(setq en (car (entsel "\nPick a block:")))
(setq obj (vlax-ename->vla-object en))
(setq objarr (vla-Explode obj)
lstobj (vlax-safearray->list
(vlax-variant-value objarr)
)
)
(setq lstent (mapcar 'vlax-vla-object->ename lstobj))
(princ lstent)
)

Xin chào mọi người.Mình có 1 yêu cầu nhỏ.Mọi người giúp đỡ.Ai có lisp tính diện tích phần hatch rồi ghi ra file text ( có thể ghi bất kỳ chỗ nào mình kích chuột hoặc là chọn text sẵn có cũng được).Trên diễn đàn có file lisp này rồi nhưng link không down được.Ai có hoặc làm được thì up lên giúp mình nhé.Cảm ơn rất nhiều.
  • 0

#1033 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 07 April 2010 - 08:15 AM

Ồ, sao kg có bạn nào góp ý hết nhỉ. chẳng lẽ kg có bạn nào đụng phải vđ này nhỉ. Về vđ này mình cũng đang cố gắng nhưng vì kiến thức vl của mình kém nên kg vận dụng đc (mình chỉ biết autolisp thôi). Tuy nhiên, mình nghỉ vđ này sẽ có thể giải quyết được vì cad từ r2000 trở lên đã cho hiệu chỉnh block (lúc này block đã trở thành một bv, mình có thể sd lisp như đối với bv). Có lẽ vđ này phải có hàm mở đối tượng là block thay vì là bản vẽ mới giải quyết đc. Tuy nhiên, mình kg biết những hàm như thế trên vl. Các cao thủ nào rành về vl có thể hỗ trợ mình đc chăng. Cũng có thể vđ này đã đc giải quyết nhẹ nhàng hơn nhưng mình kg biết, xin chỉ điểm

Bạn tham khảo Lisp sau :
(defun c:blk (/ blk en)
(setq en (car (entsel "\nPick a block:")))
(setq Blk (vlax-ename->vla-object en))
(foreach memb (vlax-invoke Blk 'Explode)
;duyet qua cac doi tuong trong Block
(if (wcmatch (vla-get-ObjectName memb) "*Polyline")
(progn
(if (eq (vla-get-Layer memb) "1");doi tuong la Pline tren Layer 1
(princ "Pline tren layer 1")) ;getdata : lay toa do Pline
(if (eq (vla-get-Layer memb) "2");doi tuong la Pline tren Layer 2
(princ "Pline tren layer 2")) ;getdata : lay toa do Pline
))
(vla-delete memb) )
(princ))


hoặc Lisp TRIM giữa Block và các đối tuợng khác.
http://www.cadviet.c...o...ost&p=81690
  • 3

#1034 connaivang

connaivang

    biết vẽ arc

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

Đã gửi 07 April 2010 - 09:12 AM

Chào tất cả các bác trên diễn đàn.
Xin được cảm ơn các bác đã giúp đỡ em rất nhiều trong thời gian qua.
Đây là một diễn đàn thật sự rất bổ ích.
Em có một câu hỏi mong được diễn đàn giúp đỡ.
Em giả sử trong một dự án nào đó, chúng ta có rất nhiều bản vẽ CAD. Trong số đó có các bản vẽ lắp, bản vẽ chi tiết, bản vẽ thống kê số lượng chi tiết (cái này có thể là file CAD hoặc file Excel),...
Em không biết được liệu CAD có thể có chức năng link các dữ kiện ở các bản vẽ này với nhau có được không? Nếu dùng Lisp thì liệu có thêm chức năng này được không?
Ở đây, em đã upload lên diễn đàn một ví dụ nho nhỏ cụ thể. Ví dụ của em là có một bản vẽ lắp BV01, hai bản vẽ chi tiết (mỗi bản vẽ có hai chi tiết với số lượng khác nhau) BV02 và BV03, cùng một bản vẽ thống kê số lượng chi tiết Parlist như sau:
http://myfreefilehos...57ee70b7_0.78MB
Những bản vẽ này đều liên quan với nhau về số lượng, vật liệu, kích thước,... Nếu giả sử em thay đổi một trong các thông số như vật liệu hay kích thước ở một trong các bản vẽ BV02 hay BV03 thì làm cách nào để bản vẽ BV01 và bản vẽ Parlist kia cũng cập nhật được sự thay đổi ấy.
Mong các bác tìm hiểu giúp em.
Xin cảm ơn các bác rất nhiều.


Không có ai quan tâm giúp đỡ em việc này sao? Giúp em với các bác hảo tâm ơi
  • 0

#1035 ndtnv

ndtnv

    biết lệnh minsert

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

Đã gửi 07 April 2010 - 01:57 PM

Mình đang tìm cách truy xuất dữ liệu của đối tượng trong một block. Giả sử trong block có một hình chữ nhật nằm trong layer "1", một hình chữ nhật khác nằm trong layer "2". Thông qua lisp, làm thế nào biết được tọa độ của hai hình chữ nhật đó trong bản vẽ.
Bạn nào biết vấn đề này xin hướng dẫn, cám ơn nhiều.


Sau đây là đoạn code sample lấy block object
(setq bl (ssname (ssget ":S") 0))
(setq blref (vlax-ename->vla-object bl))
(setq blname (vlax-get-property blref 'Name))
(setq dbl (tblobjname "block" blname))
(setq blobj (vlax-ename->vla-object (cdr (assoc 330 (entget dbl)))))
(setq i 0 n (vlax-get-property blobj 'Count ))

sau đó duyệt qua từng item trong blobj để lấy hcn với layer cần thiết (VD "1")
vì bạn không post bản vẽ nên giả sử ObjectName của hcn là "AcDbPolyline"
bạn sửa lại nếu không đúng

(setq it (vlax-invoke-method blobj 'item i))
(setq la (vlax-get-property it 'Layer))
(setq on (vlax-get-property it 'ObjectName))
(if (and (= la "1") (= on "AcDbPolyline"))
(vlax-invoke-method it 'GetBoundingBox 'p1 'p2)
)
Ta được tọa độ tương đối của 2 điểm BoundingBox của hcn so với điểm insert
của block đã select.
Việc chuyển tọa độ p1, p2 về WCS chỉ là bài toán về hình học và lượng giác.

So sánh 2 cách:
Cách explode đơn giản, nhưng không đúng với attribute , nếu block có scale thì dimension không đúng.
Cách truy xuất trực tiếp phức tạp hơn, đặc biệt là khi xoay 3D nhưng chính xác và an toàn.
Nếu chạy với nhiều block cũng nhanh hơn vì chỉ truy xuất các đối tượng 1 lần.
  • 1

#1036 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

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

Đã gửi 07 April 2010 - 06:30 PM

Sau đây là đoạn code sample lấy block object

(setq bl (ssname (ssget ":S") 0))
(setq blref (vlax-ename->vla-object bl))
(setq blname (vlax-get-property blref 'Name))
(setq dbl (tblobjname "block" blname))
(setq blobj (vlax-ename->vla-object (cdr (assoc 330 (entget dbl)))))
(setq i 0 n (vlax-get-property blobj 'Count ))

sau đó duyệt qua từng item trong blobj để lấy hcn với layer cần thiết (VD "1")
vì bạn không post bản vẽ nên giả sử ObjectName của hcn là "AcDbPolyline"
bạn sửa lại nếu không đúng

(setq it (vlax-invoke-method blobj 'item i))
(setq la (vlax-get-property it 'Layer))
(setq on (vlax-get-property it 'ObjectName))
(if (and (= la "1") (= on "AcDbPolyline"))
(vlax-invoke-method it 'GetBoundingBox 'p1 'p2)
)
Ta được tọa độ tương đối của 2 điểm BoundingBox của hcn so với điểm insert
của block đã select.
Việc chuyển tọa độ p1, p2 về WCS chỉ là bài toán về hình học và lượng giác.

Cám ơn bạn ndtnv, thiep, gia_bach và các bạn. Mình chỉ bí cách thâm nhập vào trong block để tím ra đối tượng có đặc điểm riêng thôi, còn các thao tác chọn và truy xuất dữ lịêu đối tượng thì mình làm đc. Nếu kg có các bạn, chắc mình chào thua quá. Một lần nữa cám ơn các bạn
  • 0

#1037 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 07 April 2010 - 10:08 PM

Chào tất cả các bác trên diễn đàn.
Xin được cảm ơn các bác đã giúp đỡ em rất nhiều trong thời gian qua.
Đây là một diễn đàn thật sự rất bổ ích.
Em có một câu hỏi mong được diễn đàn giúp đỡ.
Em giả sử trong một dự án nào đó, chúng ta có rất nhiều bản vẽ CAD. Trong số đó có các bản vẽ lắp, bản vẽ chi tiết, bản vẽ thống kê số lượng chi tiết (cái này có thể là file CAD hoặc file Excel),...
Em không biết được liệu CAD có thể có chức năng link các dữ kiện ở các bản vẽ này với nhau có được không? Nếu dùng Lisp thì liệu có thêm chức năng này được không?
Ở đây, em đã upload lên diễn đàn một ví dụ nho nhỏ cụ thể. Ví dụ của em là có một bản vẽ lắp BV01, hai bản vẽ chi tiết (mỗi bản vẽ có hai chi tiết với số lượng khác nhau) BV02 và BV03, cùng một bản vẽ thống kê số lượng chi tiết Parlist như sau:
http://myfreefilehos...57ee70b7_0.78MB
Những bản vẽ này đều liên quan với nhau về số lượng, vật liệu, kích thước,... Nếu giả sử em thay đổi một trong các thông số như vật liệu hay kích thước ở một trong các bản vẽ BV02 hay BV03 thì làm cách nào để bản vẽ BV01 và bản vẽ Parlist kia cũng cập nhật được sự thay đổi ấy.
Mong các bác tìm hiểu giúp em.
Xin cảm ơn các bác rất nhiều.

Chào bạn!
Vấn đề bạn muốn không đơn giản đâu. Theo hiểu biết của ssg thì với cái "tầm" của AutoCAD, nhiệm vụ bạn đặt ra cho nó là "bất khả thi". Có dùng lisp hay VBA hỗ trợ cũng "bó tay chấm com"!

1- Một chi tiết nào đó, khi bạn vẽ trên bản vẽ chi tiết và bản vẽ lắp nói chung là khác nhau (các đường nét, yếu tố cấu thành nên chúng khác nhau). Ví dụ, chi tiết trục trên bản lắp của bạn có gạch mặt cắt còn trên bản chi tiết (BV02) thì không. AutoCAD không thể hiểu 2 cái đó là một được. Mà đã không hiểu thì không thể có chuyện cái này thay đổi thì cái kia update theo.

2- Bạn tìm hiểu lệnh XAttach (Menu-Insert-DWG Reference...) có thể đáp ứng được phần nào đó ý muốn của bạn. Tuy nhiên, theo ssg thì tính năng này còn quá "khiêm tốn", chả bõ bèn gì so với nhu cầu đa dạng và phức tạp trong thực tế.

3- Nếu có điều kiện, bạn thử nghiên cứu SolidWorks hoặc Inventor xem. Yêu cầu của bạn hầu như được đáp ứng hoàn toàn vì chúng quản lý các đối tượng theo "cung cách" khác hẳn, có thể nói là ở một "tầm" cao hơn AutoCAD rất nhiều. Cùng một đối tượng thì dù nằm trong bản vẽ chi tiết (part) hay trong bản vẽ lắp (assembly) cũng chính là nó. Chương trình hiểu đối tượng như là một thực thể hình học 3D thật sự. Do đó, khi bạn thay đổi "cái này" thì "cái kia" đương nhiên tự động update theo.
  • 0

#1038 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 08 April 2010 - 06:08 AM

Phiphi nên cho lại ví dụ khác hoặc cho thêm thông tin, vì 2 file bạn upload không tạo nên một điển hình: chương trình lisp không biết lấy pline (clip) của viewport ở đâu bên model.

Cháo bác Nguyen Hoanh.
Lisp CHSPACE đã viết sẵn cho việc chuyển đổi cả HAI chiều rồi (mới phát hiện tối qua)
Dùng chung một lệnh CHSPACE, khi làm việc thì phải luôn ở Paper Space.
Chuyển Objects từ Layout sang Model thì tự động nhung khi muốn chuyển Objects từ Model sand Layout thì phải làm như sau:
+ Switch sang Paper Space.
+ Set khổ giấy.
+ Tạo 1 viewport.
+ Double click vào bên trong viewport để chuyển vào Model.
+ Lệnh CHSPACE rồi select objects.
+ Lisp chuyển các selected objects sang Paper Space.
Cái bất tiện là lisp CHSPACE chỉ thực hiện cái gọi là WHAT YOU SEE IS WHAT YOU GET.
Bây giờ nhờ Bác làm sao để có thể thêm vào option cho Scale để có thể khắc phục cái WYSIWYG.
Thank you.
P/s: Lệnh MODEL dùng chuyển từ Paper Space sang Model Space vậy lệnh gì dùng để chuyển từ Model Space sang Paper Space vậy các Bác?
  • 0

#1039 connaivang

connaivang

    biết vẽ arc

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

Đã gửi 08 April 2010 - 09:17 AM

Chào bạn!
Vấn đề bạn muốn không đơn giản đâu. Theo hiểu biết của ssg thì với cái "tầm" của AutoCAD, nhiệm vụ bạn đặt ra cho nó là "bất khả thi". Có dùng lisp hay VBA hỗ trợ cũng "bó tay chấm com"!

1- Một chi tiết nào đó, khi bạn vẽ trên bản vẽ chi tiết và bản vẽ lắp nói chung là khác nhau (các đường nét, yếu tố cấu thành nên chúng khác nhau). Ví dụ, chi tiết trục trên bản lắp của bạn có gạch mặt cắt còn trên bản chi tiết (BV02) thì không. AutoCAD không thể hiểu 2 cái đó là một được. Mà đã không hiểu thì không thể có chuyện cái này thay đổi thì cái kia update theo.

2- Bạn tìm hiểu lệnh XAttach (Menu-Insert-DWG Reference...) có thể đáp ứng được phần nào đó ý muốn của bạn. Tuy nhiên, theo ssg thì tính năng này còn quá "khiêm tốn", chả bõ bèn gì so với nhu cầu đa dạng và phức tạp trong thực tế.

3- Nếu có điều kiện, bạn thử nghiên cứu SolidWorks hoặc Inventor xem. Yêu cầu của bạn hầu như được đáp ứng hoàn toàn vì chúng quản lý các đối tượng theo "cung cách" khác hẳn, có thể nói là ở một "tầm" cao hơn AutoCAD rất nhiều. Cùng một đối tượng thì dù nằm trong bản vẽ chi tiết (part) hay trong bản vẽ lắp (assembly) cũng chính là nó. Chương trình hiểu đối tượng như là một thực thể hình học 3D thật sự. Do đó, khi bạn thay đổi "cái này" thì "cái kia" đương nhiên tự động update theo.


Chân thành cảm ơn bác ssq đã quan tâm đến mong muốn của em.
Thực ra, mong muốn của em không đến mức sâu xa như bác đã đề cập đâu. Ở đây, điều em quan tâm là khả năng thống kê (ví dụ như số lượng, vật liệu, kích thước phôi, ...) của các bản vẽ mà thôi chứ không cần phải liên kết bền chặt mọi yếu tố. Nếu bác đã xem qua một ví dụ của em, bác sẽ thấy có phần bảng thống kê ở phía trên khung tên và ở file thống kê chung PARTLIST. Em muốn hỏi liệu chúng ta có thể tạo sự liên kết giữa chúng hay không? Em giả sử trong file BV01 (Bản vẽ lắp) số lượng các chi tiết không phải như trong hình vẽ đó nữa mà có thể tăng hoặc giảm, thì làm cách nào đó, số lượng trong bản PARTLIST cũng sẽ thay đổi theo. Hoặc như, vật liệu chế tạo, kích thước phôi trong các bản vẽ chi tiết BV02, BV03 có sự thay đổi thì bằng cách nào đó, sự thống kê trong bản vẽ lắp và bản thống kê chung cũng sẽ cập nhật được những thông tin này.
Mong muốn của em là như vậy, mong các bác nghiên cứu giúp em xem liệu AutoCAD, với sự giúp đỡ của autolisp hay VBA có thể giải quyết được điều em mong muốn hay không?
Rất cảm ơn các bác trong diễn đàn đã quan tâm.
Chúc các bác luôn mạnh khoẻ và vui vẻ!
  • 0

#1040 thonghoang1

thonghoang1

    biết vẽ polygon

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

Đã gửi 08 April 2010 - 04:02 PM

mình nhở mấy anh viết dum minh cái lisp thực hiện nội dung sau được không.mình có một bảng khối lượng giống trong file mình gởi.các số 1,2,3,4 chỉ là vị trí của các text đấy thôi,các text của từng vị trí có thể không thẳng hàng,cột nhau.giờ mình cần sắp xếp các text có chử đầu tiên giống nhau vào cùng một cột,(ví dụ:các text có chử đắp vào một cột,đào vào một cột.....)có thể có nhiều vị trí chú không phải chỉ có 4 vị trí như trong bảng vẽ mình đửa.mong mọi người quan tâm.nêu không hiêu ý mình có thể liên lạc qua yahoo.
http://www.cadviet.c.../drawing2_6.dwg
  • 0