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

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

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

Chào các bác trên diễn đàn, nhờ các bác viết hộ đoạn mã dùng để áp dụng đoạn lệnh sau ko lỗi:

(c:cal "chuoi phep tinh")

 

Khi chuỗi phép tính là các số nguyên lớn thì hàm chạy sai hoặc không hiểu (ex: "1000000*2000000+3000000/4000000-5000000")

 

Cảm ơn các bác trước, mong hồ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
Ngày trước mình có yêu cầu lisp chuyển đường 2d polyline thành đường 3d polyline và được bác Tuệ và bác Thiệp giúp đỡ có một lisp.

(defun c:2d3d(/ curve pre i p lstdiem z lstpoint x ss oldos)

(vl-load-com)

............................

)

các bác có thể chỉnh sửa lisp trên để khi chỉnh sửa text thì cao độ ở đường 3d polyline cũng thay đổi theo.

cảm ơn các bác trước nhé!

Chào Tuynh, Thiep xin góp 1 lisp update các cao độ các nút của 3Dpoly theo text độ cao của các nút đã chỉnh sữa.

Thuật toán của lisp là tìm ứng với mỗi text số nào gần nút của 3Dpoly nhất sẽ update cho cao độ ứng với nút ấy.

;; free lisp from cadviet.com
;;; Lisp update do cao cho các nút cua 3DOPLY
;;; BY Thiep 03/2010
;;; yeu cau: cài dat express tools
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;------------------------------------
(defun timgan (p lst / dmin ensave p2 d)
 (foreach l lst
   (setq p2 (car l)
  d  (distance p p2)
   )
   (if	(or (not dmin) (> dmin d))
     (setq dmin d
    ensave l
     )
   )
 )
 ensave
)
;;;---------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
 (setq	PntArr (vlax-make-safearray
	 vlax-vbDouble
	 (cons 0 (1- (length Lp)))
       )
 )
 (vlax-safearray-fill PntArr Lp)
 (vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;--------------------------------
(defun c:u3dp (/ ss	   lstentext olsmd     entPL	 lstent
	 lstentext hei	     Lstnum    lstpo	 lsp p1
	)
 (or ActDoc
     (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (or *Model* (setq *Model* (vla-get-ModelSpace ActDoc)))
 (setq olsmd (getvar "OSMODE"))
 (setvar "osmode" 0)
 (command "undo" "be")
 (setq lstent (acet-ss-to-list (ssget '((0 . "TEXT,POLYLINE")))))
 (foreach ent lstent
   (if	(eq (dxf 0 ent) "TEXT")
     (setq lstentext (cons ent lstentext))
     (setq entPL ent)
   )
 )
 (foreach ent lstentext
   (setq po  (dxf 10 ent)
  hei (distof (dxf 1 ent))
   )
   (if	hei
     (setq Lstnum (cons (cons po hei) Lstnum))
   )
 )
 (setq	lstpo (acet-geom-vertex-list entPL)
lsp   nil
 )
 (foreach po lstpo
   (setq p1  (timgan po Lstnum)
  lsp (append (list (car po) (cadr po)) (list (cdr p1)) lsp)
   )
 )
 (foreach ent lstentext
   (setq po (dxf 10 ent))
   (vla-put-InsertionPoint
     (vlax-ename->vla-object ent)
     (vlax-3d-point
(list (car po) (cadr po) (distof (dxf 1 ent)))
     )
   )
 )
 (entdel entPL)
 (3DPoly lsp *Model*)
 (command "undo" "en")
 (setvar "osmode" olsmd)
 (princ "\nChuc ban thanh cong! Thiep.")
 (princ)
)

 

Chào mọi người, tôi muốn tìm một đối tượng nằm gần nhất 1 điểm nào đó thì phải làm thế nào?

Rất mong mọi người chỉ giúp.

Trân trọng cảm ơn.

Chào hoaletrang, bạn có thể tham khảo hàm con timgan ở lisp trên, hàm này Thiep cũng tham khảo từ bác Hoanh.

  • 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
Chào hoaletrang, bạn có thể tham khảo hàm con timgan ở lisp trên, hàm này Thiep cũng tham khảo từ bác Hoanh.

Cảm ơn bạn, nhưng ý của tôi là nó tự tìm trong bản vẽ, nếu bản vẽ có ít đối tượng thì chọn select all cũng được nhưng với bản vẽ lớn mà làm nhẽ chạy rất lâ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ảm ơn bạn, nhưng ý của tôi là nó tự tìm trong bản vẽ, nếu bản vẽ có ít đối tượng thì chọn select all cũng được nhưng với bản vẽ lớn mà làm nhẽ chạy rất lâu.

Đúng là nó sẽ chạy rất lâu khi có số lượng lớn các đối tượng. Nhưng nếu bạn ước đoán trước phạm vi bán kính tối thiểu cần tìm thì nó sẽ chạy rất nhanh. Bạn hãy post lên 1 bản vẽ ví dụ xem, tôi có cách giúp 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

Không cần gửi dwg lên đâu vì mục đích rất đơn giản thôi, giả sử ta có 1 điểm cho trước, bây giờ muốn vẽ 1 line từ điểm đó đến điểm chèn (basepoint) của một đối tượng gần nhất. Thậm chí tôi còn đang muốn tìm đường biên gần nhất của 1 đối tượng nào đó.

Vấn đề ở đây tôi nghĩ là thuật toán, có lẽ nó gần giống như việc tìm đường đi ngắn nhất, tuy nhiên trong Cad quá phức tạp, chắc trong cad sẽ có 1 chức năng như thế nhưng ẩn dấu ở đâu đó mà ta chưa biết.

À quên, tất cả đều phải tự động, không có thao tác bằng tay.

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
Chào Tuynh, Thiep xin góp 1 lisp update các cao độ các nút của 3Dpoly theo text độ cao của các nút đã chỉnh sữa.

Thuật toán của lisp là tìm ứng với mỗi text số nào gần nút của 3Dpoly nhất sẽ update cho cao độ ứng với nút ấy.

;; free lisp from cadviet.com
;;; Lisp update do cao cho các nút cua 3DOPLY
;;; BY Thiep 03/2010
;;; yeu cau: cài dat express tools
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;------------------------------------
(defun timgan (p lst / dmin ensave p2 d)
 (foreach l lst
   (setq p2 (car l)
  d  (distance p p2)
   )
   (if	(or (not dmin) (> dmin d))
     (setq dmin d
    ensave l
     )
   )
 )
 ensave
)
;;;---------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
 (setq	PntArr (vlax-make-safearray
	 vlax-vbDouble
	 (cons 0 (1- (length Lp)))
       )
 )
 (vlax-safearray-fill PntArr Lp)
 (vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;--------------------------------
(defun c:u3dp (/ ss	   lstentext olsmd     entPL	 lstent
	 lstentext hei	     Lstnum    lstpo	 lsp p1
	)
 (or ActDoc
     (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (or *Model* (setq *Model* (vla-get-ModelSpace ActDoc)))
 (setq olsmd (getvar "OSMODE"))
 (setvar "osmode" 0)
 (command "undo" "be")
 (setq lstent (acet-ss-to-list (ssget '((0 . "TEXT,POLYLINE")))))
 (foreach ent lstent
   (if	(eq (dxf 0 ent) "TEXT")
     (setq lstentext (cons ent lstentext))
     (setq entPL ent)
   )
 )
 (foreach ent lstentext
   (setq po  (dxf 10 ent)
  hei (distof (dxf 1 ent))
   )
   (if	hei
     (setq Lstnum (cons (cons po hei) Lstnum))
   )
 )
 (setq	lstpo (acet-geom-vertex-list entPL)
lsp   nil
 )
 (foreach po lstpo
   (setq p1  (timgan po Lstnum)
  lsp (append (list (car po) (cadr po)) (list (cdr p1)) lsp)
   )
 )
 (foreach ent lstentext
   (setq po (dxf 10 ent))
   (vla-put-InsertionPoint
     (vlax-ename->vla-object ent)
     (vlax-3d-point
(list (car po) (cadr po) (distof (dxf 1 ent)))
     )
   )
 )
 (entdel entPL)
 (3DPoly lsp *Model*)
 (command "undo" "en")
 (setvar "osmode" olsmd)
 (princ "\nChuc ban thanh cong! Thiep.")
 (princ)
)

Chào hoaletrang, bạn có thể tham khảo hàm con timgan ở lisp trên, hàm này Thiep cũng tham khảo từ bác Hoanh.

Chào Thiep, Tuynh chạy thử lisp của Thiep nhưng sau khi chạy lisp thì cao độ các đỉnh 3d Polyline lại trở về 0.00 hết Thiep giúp mình xem lại lisp được không?

Cảm ơn Thiep 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
Không cần gửi dwg lên đâu vì mục đích rất đơn giản thôi, giả sử ta có 1 điểm cho trước, bây giờ muốn vẽ 1 line từ điểm đó đến điểm chèn (basepoint) của một đối tượng gần nhất. Thậm chí tôi còn đang muốn tìm đường biên gần nhất của 1 đối tượng nào đó.

Vấn đề ở đây tôi nghĩ là thuật toán, có lẽ nó gần giống như việc tìm đường đi ngắn nhất, tuy nhiên trong Cad quá phức tạp, chắc trong cad sẽ có 1 chức năng như thế nhưng ẩn dấu ở đâu đó mà ta chưa biết.

À quên, tất cả đều phải tự động, không có thao tác bằng tay.

Cách chọn đối tuơng từ 1 điểm cho truớc. (Trong t/hợp bản vẽ lớn)

 

p0 : là điểm cho truớc.

delta : buớc nhảy

p1 = (polar p0 x y) ; vị trí cao nhất bên phải cửa sổ

p2 = (polar p0 -x -y) ; vị trí thấp nhất bên trái cửa sổ

 

(while (null (ssget "_C" p1 p2 ) )

x= x + delta ; tăng k/thuớc phuơng ngang cửa sổ

y= y + delta ; tăng k/thuớc phuơng đứng cửa sổ

p1 = (polar p0 x y)

p2 = (polar p0 -x -y) )

 

Sau khi chọn đuợc đối tuợng, gọi hàm TìmGần như đề nghị của thiep

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
Chào Thiep, Tuynh chạy thử lisp của Thiep nhưng sau khi chạy lisp thì cao độ các đỉnh 3d Polyline lại trở về 0.00 hết Thiep giúp mình xem lại lisp được không?

Cảm ơn Thiep nhé.

Khi máy báo "Select objects:", Bạn phải chọn cả đối tượng polyline và text cao độ.

Bạn chép đoạn mã nhắc nhở: (prompt "\nChon doi tuong 3DPOLYLINE & TEXT cao do:")

vào trước dòng: (setq lstent (acet-ss-to-list (ssget '((0 . "TEXT,POLYLINE"))))).

Chúc Tuynh thành công.

 

Cách chọn đối tuơng từ 1 điểm cho truớc. (Trong t/hợp bản vẽ lớn)

 

p0 : là điểm cho truớc.

delta : buớc nhảy

p1 = (polar p0 x y) ; vị trí cao nhất bên phải cửa sổ

p2 = (polar p0 -x -y) ; vị trí thấp nhất bên trái cửa sổ

 

(while (null (ssget "_C" p1 p2 ) )

x= x + delta ; tăng k/thuớc phuơng ngang cửa sổ

y= y + delta ; tăng k/thuớc phuơng đứng cửa sổ

p1 = (polar p0 x y)

p2 = (polar p0 -x -y) )

 

Sau khi chọn đuợc đối tuợng, gọi hàm TìmGần như đề nghị của thiep

Gia Bach rất hiểu ý Thiep, delta : ở đây Thiep cho đó là bán kính tối thiểu, tùy theo từng bản vẽ người dùng sẽ ước lượng bán kính này. Thiep cũng chưa hiểu đối tượng cần tìm là đối tượng gì, thiep đang chờ 1 ví dụ cụ thể

  • 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
Khi máy báo "Select objects:", Bạn phải chọn cả đối tượng polyline và text cao độ.

Bạn chép đoạn mã nhắc nhở: (prompt "\nChon doi tuong 3DPOLYLINE & TEXT cao do:")

vào trước dòng: (setq lstent (acet-ss-to-list (ssget '((0 . "TEXT,POLYLINE"))))).

Chúc Tuynh thành công.

Cám ơn Thiep.

Tuynh làm được rùi.

Ngoài lề chút nhé, cho Tuynh hỏi là Thiep làm về lĩnh vực gì vậy?

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 Thiep.

Tuynh làm được rùi.

Ngoài lề chút nhé, cho Tuynh hỏi là Thiep làm về lĩnh vực gì vậy?

Chào Tuynh, Nếu bạn để các đối tượng text cao độ vào 1 lớp tên là TEXTCAODO, thì lisp sau đây chỉ cần chọn POLYLINE cần update thôi:

;; free lisp from cadviet.com
;;; Lisp update do cao cho các nút cua 3DOPLY
;;; BY Thiep 03/2010
;;; Yeu cau: cai dat Express tools
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;------------------------------------
(defun timgan (p lst / dmin ensave p2 d)
 (foreach l lst
   (setq p2 (car l)
  d  (distance p p2)
   )
   (if	(or (not dmin) (> dmin d))
     (setq dmin d
    ensave l
     )
   )
 )
 ensave
)
;;;---------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
 (setq	PntArr (vlax-make-safearray
	 vlax-vbDouble
	 (cons 0 (1- (length Lp)))
       )
 )
 (vlax-safearray-fill PntArr Lp)
 (vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;--------------------------------
(defun c:u3dp (/ ss	   lstentext olsmd     entPL	 lstent
	 lstentext hei	     Lstnum    lstpo	 lsp p1
	)
 (or ActDoc
     (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (or *Model* (setq *Model* (vla-get-ModelSpace ActDoc)))
 (setq olsmd (getvar "OSMODE"))
 (setvar "osmode" 0)
 (command "undo" "be")
 (prompt "\nChon doi tuong 3DPOLYLINE & TEXT cao do:")
 (setq	lstenttext (acet-ss-to-list
	     (ssget "X" '((0 . "TEXT") (8 . "TEXTDOCAO")))
	   )
entPL	   (ssname (ssget '((0 . "POLYLINE"))) 0)
 )
 (setvar "clayer" (dxf 8 entPL))
 (foreach ent lstenttext
   (setq po  (dxf 10 ent)
  hei (distof (dxf 1 ent))
   )
   (if	hei
     (setq Lstnum (cons (cons po hei) Lstnum))
   )
 )
 (setq	lstpo (acet-geom-vertex-list entPL)
lsp   nil
 )
 (foreach po lstpo
   (setq p1  (timgan po Lstnum)
  lsp (append (list (car po) (cadr po)) (list (cdr p1)) lsp)
   )
 )
 (foreach ent lstenttext
   (setq po (dxf 10 ent))
   (vla-put-InsertionPoint
     (vlax-ename->vla-object ent)
     (vlax-3d-point
(list (car po) (cadr po) (distof (dxf 1 ent)))
     )
   )
 )
 (entdel entPL)
 (3DPoly lsp *Model*)
 (command "undo" "en")
 (setvar "osmode" olsmd)
 (princ "\nChuc ban thanh cong! Thiep.")
 (princ)
)

 

Ngoài lề: Thiep không phải là dân xây dựng, dân cơ khí, hay dân trắc đạc... Thiep chỉ là "lều địa chất" Thiep yêu AutoCad, nhưng rất ít khi dùng Autocad để kiếm tiền. Vậy đó! hề! hề! hề!

  • 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
Cách chọn đối tuơng từ 1 điểm cho truớc. (Trong t/hợp bản vẽ lớn)

 

p0 : là điểm cho truớc.

delta : buớc nhảy

p1 = (polar p0 x y) ; vị trí cao nhất bên phải cửa sổ

p2 = (polar p0 -x -y) ; vị trí thấp nhất bên trái cửa sổ

 

(while (null (ssget "_C" p1 p2 ) )

x= x + delta ; tăng k/thuớc phuơng ngang cửa sổ

y= y + delta ; tăng k/thuớc phuơng đứng cửa sổ

p1 = (polar p0 x y)

p2 = (polar p0 -x -y) )

 

Sau khi chọn đuợc đối tuợng, gọi hàm TìmGần như đề nghị của thiep

Cách này mình cũng đã từng làm lâu lắm rồi, tuy nhiên đây cũng chỉ là giải pháp tình thế thôi, vì muốn chọn được, đối tượng nằm trên p1, p2 phải có trên màn hình. Có lẽ bạn phải zoom all và bật các layer cần thiết trước khi dùng lệ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
Chào Tuynh, Nếu bạn để các đối tượng text cao độ vào 1 lớp tên là TEXTCAODO, thì lisp sau đây chỉ cần chọn POLYLINE cần update thôi:
;; free lisp from cadviet.com
;;; Lisp update do cao cho các nút cua 3DOPLY
;;; BY Thiep 03/2010
;;; Yeu cau: cai dat Express tools
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;------------------------------------
(defun timgan (p lst / dmin ensave p2 d)
 (foreach l lst
   (setq p2 (car l)
  d  (distance p p2)
   )
   (if	(or (not dmin) (> dmin d))
     (setq dmin d
    ensave l
     )
   )
 )
 ensave
)
;;;---------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
 (setq	PntArr (vlax-make-safearray
	 vlax-vbDouble
	 (cons 0 (1- (length Lp)))
       )
 )
 (vlax-safearray-fill PntArr Lp)
 (vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;--------------------------------
(defun c:u3dp (/ ss	   lstentext olsmd     entPL	 lstent
	 lstentext hei	     Lstnum    lstpo	 lsp p1
	)
 (or ActDoc
     (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (or *Model* (setq *Model* (vla-get-ModelSpace ActDoc)))
 (setq olsmd (getvar "OSMODE"))
 (setvar "osmode" 0)
 (command "undo" "be")
 (prompt "\nChon doi tuong 3DPOLYLINE & TEXT cao do:")
 (setq	lstenttext (acet-ss-to-list
	     (ssget "X" '((0 . "TEXT") (8 . "TEXTDOCAO")))
	   )
entPL	   (ssname (ssget '((0 . "POLYLINE"))) 0)
 )
 (setvar "clayer" (dxf 8 entPL))
 (foreach ent lstenttext
   (setq po  (dxf 10 ent)
  hei (distof (dxf 1 ent))
   )
   (if	hei
     (setq Lstnum (cons (cons po hei) Lstnum))
   )
 )
 (setq	lstpo (acet-geom-vertex-list entPL)
lsp   nil
 )
 (foreach po lstpo
   (setq p1  (timgan po Lstnum)
  lsp (append (list (car po) (cadr po)) (list (cdr p1)) lsp)
   )
 )
 (foreach ent lstenttext
   (setq po (dxf 10 ent))
   (vla-put-InsertionPoint
     (vlax-ename->vla-object ent)
     (vlax-3d-point
(list (car po) (cadr po) (distof (dxf 1 ent)))
     )
   )
 )
 (entdel entPL)
 (3DPoly lsp *Model*)
 (command "undo" "en")
 (setvar "osmode" olsmd)
 (princ "\nChuc ban thanh cong! Thiep.")
 (princ)
)

 

Ngoài lề: Thiep không phải là dân xây dựng, dân cơ khí, hay dân trắc đạc... Thiep chỉ là "lều địa chất" Thiep yêu AutoCad, nhưng rất ít khi dùng Autocad để kiếm tiền. Vậy đó! hề! hề! hề!

Cám ơn Thiep. Lisp này gần như đã hoàn thiện rùi nhỉ.

Chúc Thiep sức khoẻ, hạnh phúc, thành đạt!

Mà đặt là lớp TEXTDOCAO như trong lisp chứ Thiep.

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 Thiep. Lisp này gần như đã hoàn thiện rùi nhỉ.

Chúc Thiep sức khoẻ, hạnh phúc, thành đạt!

Mà đặt là lớp TEXTDOCAO như trong lisp chứ Thiep.

À, phải đặt lớp là TEXTDOCAO như trong lisp. Sorry

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
Chào các bác trên diễn đàn, nhờ các bác viết hộ đoạn mã dùng để áp dụng đoạn lệnh sau ko lỗi:

(c:cal "chuoi phep tinh")

 

Khi chuỗi phép tính là các số nguyên lớn thì hàm chạy sai hoặc không hiểu (ex: "1000000*2000000+3000000/4000000-5000000")

 

Cảm ơn các bác trước, mong hồi âm.

Vì số nguyên có phạm vi -2147483648 => 2147483647

nếu ngoài phạm vi trên, phải dùng số thực.

Bạn thêm 1 dấu chấm vào số đầu tiên là được

1000000.*2000000+3000000/4000000-5000000

  • 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
Vì số nguyên có phạm vi -2147483648 => 2147483647

nếu ngoài phạm vi trên, phải dùng số thực.

Bạn thêm 1 dấu chấm vào số đầu tiên là được

1000000.*2000000+3000000/4000000-5000000

Ý mình là dùng mã lsp kia, đó là ví dụ đơn giản thôi, nếu chẳng hạn là:

100000000000*200000000000+300000000000/400000000000-500000000000

hay nhiều hàm khác phức tạp hơn thì phải chuyển tất cả các số sang số thực và ghép chúng lại theo thứ tự nhưng mình không viết mã được. Mong mọi ngườt trợ giúp, hàm có các toán tử + - * / ^ ( ). Mong giúp đỡ. Thanks

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 có một đề bài nhỏ thế này mong may anh xem và giúp cho mình một lisp:mính có 2 đường bất ký giống hình vẽ,mình cần tạo ra một số đường thẳng nằm ở trong 2 đường thẳng đấy và cách đều 2 đường thẳng đó,số đường thẳng tạo ra giửa 2 đường thẳng đó tuỷ mình đưa vào.Nếu 1 đường thẳng thì nó cách đều 2 đường thẳng gốc,nếu 2 thì 4 đường thẳng đó có khoảng cách đều nhau.......Mong mấy anh giúp,

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
em đã làm như bác hướng dẫn rồi mà vẫn báo lỗi như vậy khi sử dụng lisp TRIMBLK!nhờ bác giúp dùm em!

Nó báo lỗi gì bạn ơi ?

 

Tui đã check : Lisp chạy tốt. http://www.cadviet.com/forum/index.php?sho...ost&p=81690

Chú ý nếu Block của bạn thuộc Layer khác Layer "Hoga"

tìm và đổi dòng

(setq ss (ssget (list (cons 0 "INSERT") (cons 8 "Hoga"))))

thành tên Layer mong muốn.

(setq ss (ssget (list (cons 0 "INSERT") (cons 8 "Tên_Layer"))))

hoặc thành (setq ss (ssget (list (cons 0 "INSERT") )))

  • 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

Mong các bác giúp tôi: Làm sao tính được diện tích đào, đắp trên mặt cắt ngang được tự động hóa bằng autolisp hay VBA. Tôi gửi kèm theo file mặt cắt ngang:http://www.cadviet.com/upfiles/2/cat_ngang_1.rar

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

Em có 1 yêu cầu như thế này, không biết diễn đàn đã có người post yêu cầu tương tự chưa? Mong được giúp đỡ

Em có 1 đối tượng là 1 đường pline. Em muốn đo chiều dài của một đoạn bắt đầu từ 1 điểm trên poline và kết thúc tại 1 điểm khác trên poline, Rồi điền giá trị chiều dài đo được vào sau 1 text đã ghi sẵn.

Chọn đường thẳng cần đo. Vị trí bắt đầu đo. Vị trí kết thúc đo. Chon text cần thêm kết quả.

Nếu đã có đáp án hay cách làm khác không cần đến lisp, mong mọi người hướng dẫn. Em rất cảm ơn.

Em gởi file đính kèm.

http://www.cadviet.com/upfiles/2/hoi_2.dwg

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
Em có 1 yêu cầu như thế này, không biết diễn đàn đã có người post yêu cầu tương tự chưa? Mong được giúp đỡ

Em có 1 đối tượng là 1 đường pline. Em muốn đo chiều dài của một đoạn bắt đầu từ 1 điểm trên poline và kết thúc tại 1 điểm khác trên poline, Rồi điền giá trị chiều dài đo được vào sau 1 text đã ghi sẵn.

Chọn đường thẳng cần đo. Vị trí bắt đầu đo. Vị trí kết thúc đo. Chon text cần thêm kết quả.

Nếu đã có đáp án hay cách làm khác không cần đến lisp, mong mọi người hướng dẫn. Em rất cảm ơn.

Em gởi file đính kèm.

http://www.cadviet.com/upfiles/2/hoi_2.dwg

Chú ý File CAD bạn Upload không chuẩn về đơn vị (Text ghi là 25 m, nhưng khi đo giá trị thực là 23.16)

Bạn chạy thử Lisp này :

(defun c:len (/ len ob obj ov p1 p2 pa1 pa2 str vl)
 (defun *error* (msg)
   (if ov (mapcar 'setvar vl ov))
   (if ob (redraw ob 4))
   (if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
     (princ (strcat "\n** Error: " msg " **")))
   (princ))

 (vl-load-com)
 (setq vl '("CMDECHO"  "orthomode")
       ov (mapcar 'getvar vl))
 (mapcar 'setvar vl '(0 0))    
 (while
   (not
     (and
(setq ob (car(entsel "\nChon doi tuong can do (LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE) : ")))
(if ob (wcmatch (cdr (assoc 0 (entget ob))) "*LINE,ARC,CIRCLE,ELLIPSE") )	)      )
   (alert "\nDoi tuong da chon khong phu hop.
           \nChap nhan cac doi tuong : LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE
    \nChon lai :")    )
 (redraw ob 3)
 (while (and
   (setq p1 (getpoint "\nTu diem :"))
   (setq p2 (getpoint "\nDem diem :"))
   (setq obj (entsel "\nChon text de ghi ket qua :"))	   )
   (if (and
  (setq pa1 (vlax-curve-getParamAtPoint ob p1))
  (setq pa2 (vlax-curve-getParamAtPoint ob p2))
  (setq obj (vlax-ename->vla-object (car obj)))
  (eq (vlax-get obj 'ObjectName) "AcDbText")	  )
     (progn
(setq str (vlax-get obj 'TextString)
      len (abs (- (vlax-curve-getdistatparam ob pa1)
		  (vlax-curve-getdistatparam ob pa2)))	  )	
(vla-put-TextString obj (strcat str (rtos len) "m"))	)
     (alert "\nDiem chon khong thuoc doi tuong can do !
     \nhoac Doi tuong ghi ket qua khong phai Text!
     \nChon lai :" )      )    )  
 (redraw ob 4)
 (mapcar 'setvar vl ov)
 (princ)
)

  • 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

- Mình có một vấn đề này cần các bạn giúp đỡ:(như hình vẽ)

3L0.9614089_1_1.jpg

- Làm sao để vẽ hai tiếp tiếp của một cung tròn bất kỳ một cách nhanh và chính xác nhât.

- Quan trọng nhất là mình muốn nhờ các cao bạn viết cho cái lisp vẽ tiếp tuyến của cung tròn với cấu trúc lệnh vẽ như sau:

+ Đánh lệnh VTT , chọn cung tròn muốn vẽ tiếp tuyến , enter thì nó ra luôn hai cái tiếp tuyến kia. Nếu mà kết hợp ra được cái góc hợp bởi hai tiếp tuyến thì càng tốt( đơn vị đo góc độ, phút , giây)

- Cám ơn :undecided:

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 có một vấn đề này cần các bạn giúp đỡ:(như hình vẽ)

3L0.9614089_1_1.jpg

- Làm sao để vẽ hai tiếp tiếp của một cung tròn bất kỳ một cách nhanh và chính xác nhât.

- Quan trọng nhất là mình muốn nhờ các cao bạn viết cho cái lisp vẽ tiếp tuyến của cung tròn với cấu trúc lệnh vẽ như sau:

+ Đánh lệnh VTT , chọn cung tròn muốn vẽ tiếp tuyến , enter thì nó ra luôn hai cái tiếp tuyến kia. Nếu mà kết hợp ra được cái góc hợp bởi hai tiếp tuyến thì càng tốt( đơn vị đo góc độ, phút , giây)

- Cám ơn :undecided:

Lisp theo ý của bạn đây :

Chọn 1 loạt ARC -> Lisp sẽ vẽ tiếp tuyến như hình vẽ

(defun c:vtt(/ oldos ss i ent dd dc p1 p2 a)
(vl-load-com)
 (setq oldos (getvar "osmode"))
 (setq ss (ssget '((0 . "ARC"))) i -1)
 (setvar "osmode" 0)
 (while (setq ent (ssname ss (setq i (1+ i))))
(setq tam (cdr(assoc 10 (entget ent))))
(setq dd (vlax-curve-getstartpoint ent))
(setq dc (vlax-curve-getendpoint ent))
(setq p1 (polar dd (+ (/ pi 2) (angle dd tam)) 1))
(setq p2 (polar dc (+ (/ pi 2) (angle dc tam)) 1))
(setq a (inters dd p1 dc p2 nil))
(vl-cmdf "line" dd a "")
(vl-cmdf "line" dc a "")
 );while
 (setvar "osmode" oldos)
(princ)
)

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

×