Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

dưới đây là bản vẽ (thi công lắp đặt nước)

trong đó em có rất nhiều các block về : T, Lơi, Co, I ....

do có nhiều đường ống kích cỡ khác nhau nên các block em phải scale lại

chính vì vậy, nếu em sử dụng chương trình .lisp đếm block sẽ ko có ý nghĩa gì nhiều (chỉ đơn giản là đếm tổng số)

do đó em cần một .lisp có thể tính được số block có kích cỡ khác nhau.

rất mong bác giúp đỡ.

 

Bạn muốn kết quả như thế nào với file bạn vừa upload?

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

Mình muốn xin một lisp nối 2 đoạn thẳng dời nhau lại thành 1 đoạn thẳng liền

 

Ví dụ: Có 2 cặp đoạn thẳng như dưới

____________ _______________

______________ _____________

 

sau khi dùng lisp chọn 2 cặp trên sẽ được 2 đoạn thẳng liền nhau.

 

____________________________

____________________________

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
Mình muốn xin một lisp nối 2 đoạn thẳng dời nhau lại thành 1 đoạn thẳng liền

 

Ví dụ: Có 2 cặp đoạn thẳng như dưới

____________ _______________

______________ _____________

 

sau khi dùng lisp chọn 2 cặp trên sẽ được 2 đoạn thẳng liền nhau.

 

____________________________

____________________________

bạn dùng lệnh Join của AutoCAD (từ phiên bản 2007).

hoặc lệnh JL (join line) dưới đây. Khi gọi lệnh JL, chương trình sẽ yệu cầu bạn chọn crossing qua 1 vùng cửa sổ chứa 2 line cần nối.

(defun c:jl (/ p1 p2 p3 ssdt entla entlb tt p1a p2a tt p1b p2b layermoi TAPLINEMOI TENLAYERMOI)
 (defun thanghang (p0 p1 p2 / dx1 dy1 dx2 dy2 x1 y1 x2 y2 x0 y0)
   (setq
     x0  (car p0)
     y0  (cadr p0)
     x1  (car p1)
     y1  (cadr p1)
     x2  (car p2)
     y2  (cadr p2)
     dx1 (- x1 x0)
     dy1 (- y1 y0)
     dx2 (- x2 x0)
     dy2 (- y2 y0)
   )
   (if	(equal (* dx1 dy2) (* dx2 dy1) 0.01)
     t
     nil
   )
 )
 (defun noiline (p1 p2 p3 p4 / kq dmax)
   (if	(and (thanghang p1 p2 p3) (thanghang p1 p2 p4))
     (progn
(setq d1   (distance p1 p3)
      d2   (distance p1 p4)
      d3   (distance p2 p3)
      d4   (distance p2 p4)
      dmax (max d1 d2 d3 d4)
      kq   (cond
	     ((= dmax d1) (list p1 p3))
	     ((= dmax d2) (list p1 p4))
	     ((= dmax d3) (list p2 p3))
	     ((= dmax d4) (list p2 p4))
	     (t nil)
	   )
)
kq
     )
     nil
   )
 )  
 (setq
   p1	  (getpoint "\ngoc dau: ")
   p2	  (getcorner p1 "\ngoc sau: ")
   ssdt  (ssget "c" p1 p2 '((0 . "LINE")))
   entla (ssname ssdt 0)
   entlb (ssname ssdt 1)
   tt	  (entget entla)
   p1a	  (cdr (assoc 10 tt))
   p2a	  (cdr (assoc 11 tt))
   tt	  (entget entlb)
   p1b	  (cdr (assoc 10 tt))
   p2b	  (cdr (assoc 11 tt))
   tenlayermoi (cdr (assoc 8 (entget entla)))
 )
 (if (setq taplinemoi (noiline p1a p2a p1b p2b))
   (progn
     (command ".erase" ssdt "")
     (entmake
(list
  (cons 0 "LINE")
  (cons 8 tenlayermoi)
  (cons 10 (car taplinemoi))
  (cons 11 (cadr taplinemoi))
)
     )        
   )
   (princ "\nKhong the noi line duoc !")
 )  
(princ)
)

  • Vote tăng 2

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 muốn kết quả như thế nào với file bạn vừa upload?

thưc ra em chỉ cần một điều kiện nào đó để có thể biết được số lượng của các thiết bị (ví dụ như T fi-20, fi-27... là bao nhiêu)

kết quả xuất ra có thể là bất kì, có thể là:

command: tongbl (enter)

(s)pecified (enter)

A1 (enter)

xuất ra

9 block A1 co dien tich X m2 (hoặc là chu vi X m, hoặc là chiều dài của cạnh đứng)

11 block A1 co dien tich la Y m2

3 block A1 co dien tich la Z m2

.....

X < Y < Z < .....

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
thưc ra em chỉ cần một điều kiện nào đó để có thể biết được số lượng của các thiết bị (ví dụ như T fi-20, fi-27... là bao nhiêu)

kết quả xuất ra có thể là bất kì, có thể là:

command: tongbl (enter)

(s)pecified (enter)

A1 (enter)

xuất ra

9 block A1 co dien tich X m2 (hoặc là chu vi X m, hoặc là chiều dài của cạnh đứng)

11 block A1 co dien tich la Y m2

3 block A1 co dien tich la Z m2

.....

X

Số lượng thì ok.

Nhưng diện tích thì tôi chịu không biết lấy diện tích ở đâu?

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

Mình là thành viên mới gia nhập, xin chào CadViet. Hiện nay mình đang cần một lisp để mở bản vẽ, mong các bác giúp đỡ. Vì mình cũng đang nghiên cứu Lisp nên rất khó khăn.

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
Số lượng thì ok.

Nhưng diện tích thì tôi chịu không biết lấy diện tích ở đâu?

vậy bác có cách nào đo được chiều dài cạnh nào đó của block ko, hay lấy tỉ lệ scale của các block so với block chuẩn.

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
vậy bác có cách nào đo được chiều dài cạnh nào đó của block ko, hay lấy tỉ lệ scale của các block so với block chuẩn.

tỷ lệ (scale) block thì lấy được.

 

Còn chiều dài cạnh nào đó thì chịu.

  • 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ỷ lệ (scale) block thì lấy được.

 

Còn chiều dài cạnh nào đó thì chịu.

vậy thì hay quá

vậy bác viết cho em 1 .lisp tính tổng số block và đếm theo tỉ lệ scale so với block chuẩn với nhé

em thanks bác trước nhé.

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
vậy thì hay quá

vậy bác viết cho em 1 .lisp tính tổng số block và đếm theo tỉ lệ scale so với block chuẩn với nhé

em thanks bác trước nhé.

 

lệnh DEMBL dưới đây sẽ giúp bạn:

(defun c:dembl( / kq)
 (defun ttbl(ent)
   (setq tt (entget ent)
  name (cdr (assoc 2 tt))
  tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
   )
   (strcat name "*" tl)
 )
 (setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)	

 )
 (foreach e lst
   (if (setq old (assoc e kq))
     (setq kq (subst (cons e (1+ (cdr old))) old kq))
     (setq kq (append kq (list (cons e 1))))
   )
 )

 (foreach e kq
   (princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e))  ))
 )
 (princ)
)
(defun ss2ent(ss / sodt index lstent)
 (setq
   sodt (if ss (sslength ss) 0)	   
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)

  • 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
lệnh DEMBL dưới đây sẽ giúp bạn:

(defun c:dembl( / kq)
 (defun ttbl(ent)
   (setq tt (entget ent)
  name (cdr (assoc 2 tt))
  tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
   )
   (strcat name "*" tl)
 )
 (setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)	

 )
 (foreach e lst
   (if (setq old (assoc e kq))
     (setq kq (subst (cons e (1+ (cdr old))) old kq))
     (setq kq (append kq (list (cons e 1))))
   )
 )

 (foreach e kq
   (princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e))  ))
 )
 (princ)
)
(defun ss2ent(ss / sodt index lstent)
 (setq
   sodt (if ss (sslength ss) 0)	   
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)

em xin cám ơn bác rất nhiều, em đã chạy được chương trình rùi.

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
lệnh DEMBL dưới đây sẽ giúp bạn:

(defun c:dembl( / kq)
 (defun ttbl(ent)
   (setq tt (entget ent)
  name (cdr (assoc 2 tt))
  tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
   )
   (strcat name "*" tl)
 )
 (setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)	

 )
 (foreach e lst
   (if (setq old (assoc e kq))
     (setq kq (subst (cons e (1+ (cdr old))) old kq))
     (setq kq (append kq (list (cons e 1))))
   )
 )

 (foreach e kq
   (princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e))  ))
 )
 (princ)
)
(defun ss2ent(ss / sodt index lstent)
 (setq
   sodt (if ss (sslength ss) 0)	   
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)

Nếu scale block với tỷ lệ <1 ví dụ 0.3 thì Lisp sẽ hiểu là 3. Tức nếu có 2block scale đi=0.3Block ban đầu và 1 block scale đi =3Block ban đầu thì kết quả sẽ cho 3 block có tỷ lệ 3.

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ác bác có thể giúp em một viết Lisp có tác dụng đếm những đối tượng Line, Polyline, Circle, Arc có kích thước nhập vào theo ý mình. Nếu là line, polyline: nhập chiều dài; Circle: nhập đường kính (or bán kính)

Cấu trúc lệnh như sau:

- Gõ lệnh dkt -> Chọn toàn bộ bản vẽ -> Nhập 1 đối tượng cần đếm (Line/Pline/Circle/Arc)->Nhập kích thước của đối tượng cần đếm-->Đưa ra kết quả là số đối tượng có kích thước mà ta đã nhập.

Trong một bản vẽ cơ khí xây dựng,hoặc nội thất có rất nhiều chi tiết lỗ (để bắt bulon chẳng hạn), song cửa, em muốn ứng dụng lisp này để đếm số lượng lỗ (tương ứng với circle, arc), song cửa: sắt, nhôm kính, gỗ, nhựa....(tương ứng với line, pline) có kích thước do mình nhập vào để dự trù tính được số lượng vật liệu, thuận tiện cho việc đưa vào gia công sản xuất. Em nghĩ cái này rất cần thiết với nhiều người lắm.

Cảm ơn các bác nhiều.

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ác bác có thể giúp em một viết Lisp có tác dụng đếm những đối tượng Line, Polyline, Circle, Arc có kích thước nhập vào theo ý mình. Nếu là line, polyline: nhập chiều dài; Circle: nhập đường kính (or bán kính)

Cấu trúc lệnh như sau:

- Gõ lệnh dkt -> Chọn toàn bộ bản vẽ -> Nhập 1 đối tượng cần đếm (Line/Pline/Circle/Arc)->Nhập kích thước của đối tượng cần đếm-->Đưa ra kết quả là số đối tượng có kích thước mà ta đã nhập.

Trong một bản vẽ cơ khí xây dựng,hoặc nội thất có rất nhiều chi tiết lỗ (để bắt bulon chẳng hạn), song cửa, em muốn ứng dụng lisp này để đếm số lượng lỗ (tương ứng với circle, arc), song cửa: sắt, nhôm kính, gỗ, nhựa....(tương ứng với line, pline) có kích thước do mình nhập vào để dự trù tính được số lượng vật liệu, thuận tiện cho việc đưa vào gia công sản xuất. Em nghĩ cái này rất cần thiết với nhiều người lắm.

Cảm ơn các bác nhiều.

Có vẻ như vấn đề đặt ra của em khó mà thực hiện được phải vậy không các bác? Xin các bác cho em đôi lời về vấn đề này nhé.

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ó vẻ như vấn đề đặt ra của em khó mà thực hiện được phải vậy không các bác? Xin các bác cho em đôi lời về vấn đề này nhé.

 

Đây chỉ là một bài tóan thống kê, cực kỳ dễ luôn.

Nếu bạn chịu khó đọc bài trên diễn đàn này thì bạn cũng có thể tự mình viết ra được code

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
Mình là thành viên mới gia nhập, xin chào CadViet. Hiện nay mình đang cần một lisp để mở bản vẽ, mong các bác giúp đỡ. Vì mình cũng đang nghiên cứu Lisp nên rất khó khăn.

 

Mục đích của bạn như thế nào. Sao phải dùng lisp mở bản vẽ. Bạn nêu nyêu cầu rỏ rỏ chút được không.

 

(setq tenfilecođuongan (getfiled "CHON FILE " "" "dwg" 0))

Đây là dòng gợi ý. Làm xuất hiệu hộp thoại chọn file mặc định kiểu file là dwg.

Dữ liệu thu được là tenfilecođuongan chứa tên đầy đủ của file bạn chọn. sau đó xào nấu thế nào là việc của bạn.

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
Đây chỉ là một bài tóan thống kê, cực kỳ dễ luôn.

Nếu bạn chịu khó đọc bài trên diễn đàn này thì bạn cũng có thể tự mình viết ra được code

Vấn đề là em không biết chút xíu kiến thức gì về lisp nên em mới mạn phép post bài nhờ sự giúp đỡ của các bác.

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
Arc chỉ cần bán kính, có quan tâm đến chiều dài không bạn?

Với arc hoặc circle thì không cần chiều dài cũng được ạ, chỉ cần bán kính or đường kính, em tự tính bằng tay chiều dài khi đã đếm được đối tượng có bán kính or đường kính. Cảm ơn pác, nếu được thì tốt quá.

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
Với arc hoặc circle thì không cần chiều dài cũng được ạ, chỉ cần bán kính or đường kính, em tự tính bằng tay chiều dài khi đã đếm được đối tượng có bán kính or đường kính. Cảm ơn pác, nếu được thì tốt quá.

 

lệnh SR và SL dưới đây sẽ SELECT đối tượng theo RADIUS và SELECT đối tượng theo LENGTH.

 

(defun c:sr ()
 (setq	bk (getdist "\nVao ban kinh: ")
ss (ssget "X"
	  '((-4 . ""))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-Radius (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)


(defun c:sl ()
 (setq	bk (getdist "\nVao khoang cach: ")
ss (ssget "X"
	  '((0 . "*LINE"))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-length (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)

(vl-load-com)

  • 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
lệnh SR và SL dưới đây sẽ SELECT đối tượng theo RADIUS và SELECT đối tượng theo LENGTH.

 

(defun c:sr ()
 (setq	bk (getdist "\nVao ban kinh: ")
ss (ssget "X"
	  '((-4 . "<or") (0 . "CIRCLE") (0 . "ARC") (-4 . "or>"))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-Radius (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)


(defun c:sl ()
 (setq	bk (getdist "\nVao khoang cach: ")
ss (ssget "X"
	  '((0 . "*LINE"))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-length (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)

(vl-load-com)

 

Cảm ơn bác Hoành đã nhiệt tình giúp đỡ em! Khi em dùng thì báo lỗi với lệnh "SL" để chọn theo length như sau (em dùng Cad2004):

Command: sl
Vao khoang cach: 300
; error: ActiveX Server returned the error: unknown name: Length

 

Lisp này là chọn các đối tượng có cùng kích thước với kích thước mình nhập vào, nhưng làm thế nào để biết là có bao nhiêu đối tượng có kích thước như vậy, không lẽ sau khi chọn được rồi mình lại phải ngồi đếm hả bác. Để biết có bao nhiêu đối tượng được lựa chọn em đã nhấn Ctrl+1 nhưng làm vậy thì hơi mất thời gian. Liệu có cách nào sao khi lệnh kết thúc thì cho mình kết quả hiện ra ở dòng command không bác.

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ảm ơn bác Hoành đã nhiệt tình giúp đỡ em! Khi em dùng thì báo lỗi với lệnh "SL" để chọn theo length như sau (em dùng Cad2004):

Command: sl
Vao khoang cach: 300
; error: ActiveX Server returned the error: unknown name: Length

 

Lisp này là chọn các đối tượng có cùng kích thước với kích thước mình nhập vào, nhưng làm thế nào để biết là có bao nhiêu đối tượng có kích thước như vậy, không lẽ sau khi chọn được rồi mình lại phải ngồi đếm hả bác. Để biết có bao nhiêu đối tượng được lựa chọn em đã nhấn Ctrl+1 nhưng làm vậy thì hơi mất thời gian. Liệu có cách nào sao khi lệnh kết thúc thì cho mình kết quả hiện ra ở dòng command không bác.

giả vờ dùng lệnh move!

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
Mục đích của bạn như thế nào. Sao phải dùng lisp mở bản vẽ. Bạn nêu nyêu cầu rỏ rỏ chút được không.

 

(setq tenfilecođuongan (getfiled "CHON FILE " "" "dwg" 0))

Đây là dòng gợi ý. Làm xuất hiệu hộp thoại chọn file mặc định kiểu file là dwg.

Dữ liệu thu được là tenfilecođuongan chứa tên đầy đủ của file bạn chọn. sau đó xào nấu thế nào là việc của bạn.

Mình hiện đang làm rất nhiều bản vẽ nhỏ (thiết kế các chi tiết và đặt tên theo mã số) nên muốn mở nhanh bản vẽ chi tiết đó bằng cách lấy tên block trong bản vẽ chính luôn mà không phải mất thời gian mở bản vẽ bằng cách thông thuờng. Ví dụ nhu tên block chèn trong bản vẽ trùng với tên bản vẽ chi tiết nên chọn lệnh và chọn block cần mở bản vẽ chi tiết thì Acad tự động mở file. Bạn có thể giúp mình được không?

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
Mình hiện đang làm rất nhiều bản vẽ nhỏ (thiết kế các chi tiết và đặt tên theo mã số) nên muốn mở nhanh bản vẽ chi tiết đó bằng cách lấy tên block trong bản vẽ chính luôn mà không phải mất thời gian mở bản vẽ bằng cách thông thuờng. Ví dụ nhu tên block chèn trong bản vẽ trùng với tên bản vẽ chi tiết nên chọn lệnh và chọn block cần mở bản vẽ chi tiết thì Acad tự động mở file. Bạn có thể giúp mình được không?

Bạn đã thử như thế này chưa:

- Dùng lệnh options, rồi add đường dẫn thư mục chứa các file chi tiết vào trong Support file search path (chỉ cần làm 1 lần duy nhất).

- Mỗi khi dùng lệnh insert, nhập tên block = tên file (không cần có đuôi dwg, vd tên file là chitiet1.dwg thì bạn chỉ cần nhập chitiet1 tại lệnh insert).

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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×