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ị

Em đang tìm hiểu về lisp.Khi muốn viết lisp gọi lệnh trong cad bằng dòng COMMAND thì được nhưng viết để gọi lệnh DIMSTYLE không được.Mong các bác chỉ giùm.Thanks

(defun c:dd() (command "dimstyle"))

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 đang tìm hiểu về lisp.Khi muốn viết lisp gọi lệnh trong cad bằng dòng COMMAND thì được nhưng viết để gọi lệnh DIMSTYLE không được.Mong các bác chỉ giùm.Thanks

(defun c:dd() (command "dimstyle"))

Thường thì khi muốn gọi dialog box thì thêm (initdia). ví dụ muốn gọi dialog layer thì dùng (initdia)(command "layer") nhưng không hiểu sao với dímtyle thì không gọi được. Nếu bạn muốn gọi dialog dímtyle thì dùng (command "ddim") thì nó lên luôn.

  • 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
Cac bác ơi cho em hỏi một tý, sao em dung cái này trong cad 2007 không được vậy http://www.cadviet.com/upfiles/3/megashare...ritetoexcel.zip sau khi em NETLOAD xong em đánh lệnh toex thì cad báo (Exception has been throw by tayet an invocation) em ấn continue thì nó thoát lệnh luôn
các bác biết chỉ dùm mình với sau mình sử dụng ỨNG DỤNG CỦA AUTOCAD.NET API cho phép trích xuất text trong bản vẽ ra file exel tren cad 2007 không được vậy http://www.cadviet.com/upfiles/3/megashare...tetoexcel_1.zip

Sao không ai chịu giúp mình hết vậy, thật là buồn quá đi hu hu hu

Chào lacvanhoa.

Cần phải có thời gian mới trả lời bạn được. (vì hôm qua trên cơ quan sài Cad 2010)

Sáng nay mới chạy trên Cad 2007 kết quả OK.

Có khả năng do Win của bạn sử dụng .Net Framework 2.0 ?

thử nâng cấp .Net Framework lên version 3.5.

 

Không thể trì hoãn cái sự sung sướng đượ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
Thường thì khi muốn gọi dialog box thì thêm (initdia). ví dụ muốn gọi dialog layer thì dùng (initdia)(command "layer") nhưng không hiểu sao với dímtyle thì không gọi được. Nếu bạn muốn gọi dialog dímtyle thì dùng (command "ddim") thì nó lên luôn.

Cảm ơn bạn rất nhiều,vì vấn đề này mình thắc mắc rất nhiều mà không ai giải đáp được.Bạn làm cách nào mà tìm ra được vậy?Tiện thể cho mình hỏi muốn gọi lệnh DDPTYPE thì bằng cách nào?Vì dùnng (command "DDPTYPE") không gọi được.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
Cảm ơn bạn rất nhiều,vì vấn đề này mình thắc mắc rất nhiều mà không ai giải đáp được.Bạn làm cách nào mà tìm ra được vậy? Tiện thể cho mình hỏi muốn gọi lệnh DDPTYPE thì bằng cách nào?Vì dùnng (command "DDPTYPE") không gọi được.Thanks.

Vấn đề này, Tue_NV đã giải đáp lâu rồi mà.

Bai viet so 1649 :cheers:

Bạn xem thêm ví dụ mẫu ở bài viết 1654 nhé

Topic này trôi qua nhanh quá.

:leluoi:

Bạn muốn gọi hộp thoại DDPTYPE à?

  • 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ấn đề này, Tue_NV đã giải đáp lâu rồi mà.

Bai viet so 1649 :cheers:

Bạn xem thêm ví dụ mẫu ở bài viết 1654 nhé

Topic này trôi qua nhanh quá.

:leluoi:

Bạn muốn gọi hộp thoại DDPTYPE à?

Cảm ơn 2 bác rất nhiều,nhân tiện cho e hỏi sao dùng (command "cal") và (command "overkill") không được?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
Cảm ơn 2 bác rất nhiều,nhân tiện cho e hỏi sao dùng (command "cal") và (command "overkill") không được?Thanks.

lệnh (command "cal") dùng bình thường mà bạn, còn lện overkill thì bạn dùng (c:overkill)

  • 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 (command "cal") dùng bình thường mà bạn, còn lện overkill thì bạn dùng (c:overkill)

Nếu dùng bình thường thì được nhưng khi ta vẽ 1 đường thẳng rồi dùng lệnh stretch để kéo đoạn thẳng dài ra 1 đoạn thí dụ 'cal rồi nhấn 33x7.5 thì nó báo lỗi:

Invalid point.

; error: Function cancelled

Cảm ơn bạn rất 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
Nếu dùng bình thường thì được nhưng khi ta vẽ 1 đường thẳng rồi dùng lệnh stretch để kéo đoạn thẳng dài ra 1 đoạn thí dụ 'cal rồi nhấn 33x7.5 thì nó báo lỗi:

Invalid point.

; error: Function cancelled

Cảm ơn bạn rất nhiều.

Bạn dùng cad version bao nhiêu. Mình dùng cad 2007 vẫn bình thường trả gặp lỗi gì.

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 dùng cad version bao nhiêu. Mình dùng cad 2007 vẫn bình thường trả gặp lỗi gì.

Version 11.Bạn có dùng kết hợp với stretch và scale.... không?Nhưng nếu sử dụng trong Express thì được.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

Em mới tham gia diễn đàn gần đây thôi em thấy rất hay rất có ích cho bản thân em giúp em rất nhiều trong công việc kiến thức cad của em được cải thiện rất rõ.

em nói vòng vòng để mong được sự giúp đỡ của các bác trên đàn đó hê hê! em muốn thỉnh giáo các bác vấn đề này đây

http://www.cadviet.com/upfiles/3/to44.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

Các bạn xem hộ mình đoạn lisp này mình viết sai ở đâu mà đường tròn lúc thì tạo ra đúng lúc lại tạo ra sai (đặc biệt là có khi cùng một đoạn thẳng) bắt đi bắt lại một lúc lại sai??? Giúp mình nhé.

  (defun c:ccc ()
 (setq oldos (getvar "OSMODE"))
 (setq oldot (getvar "ORTHOMODE"))
 (setvar "OSMODE" 3)
 (setvar "ORTHOMODE" 0)
 (setvar "cmdecho" 0)
 (setq P1 (getpoint "\n Pick diem dau: "))
 (setq P2 (getpoint P1 "\n Pick diem cuoi: "))

 (if (< (cadr P1) (cadr P2))
   (progn (setq P0 P1) (setq goc (angle P1 P2)))
   (progn (setq P0 P2) (setq goc (angle P2 P1)))
 )

 (setq	X1 (car P1)
Y1 (cadr P1)
 )
 (setq	X2 (car P2)
Y2 (cadr P2)
 )

 (setq P3 (list (/ (+ X1 X2) 2) (/ (+ Y1 Y2) 2) 0))

 (setq L (abs (- X1 X2)))
 (setq H (abs (- Y1 Y2)))
 (setq i (rtos (* (/ H L) 100) 2 2))
 (setq doc (/ (* goc 180) pi))
 (if (< doc 90)
	(progn
    	 	(setq P4 (polar P3 (+ goc (/ pi 2)) 0.5))
   	;(prompt "\n nho hon 90d")
)
	(progn
 	(setq P4 (polar P3 (- goc (/ pi 2)) 0.5))
 	(setq doc (- doc 180))
   	;(prompt "\n lon hon 90d")
)
 )
 (command ".circle" P4 0.5)

 (setvar "OSMODE" oldos)
 (setvar "ORTHOMODE" oldot)
 (princ)
)

 

link bản vẽ http://www.cadviet.com/upfiles/3/drawing1_35.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
Các bạn xem hộ mình đoạn lisp này mình viết sai ở đâu mà đường tròn lúc thì tạo ra đúng lúc lại tạo ra sai (đặc biệt là có khi cùng một đoạn thẳng) bắt đi bắt lại một lúc lại sai??? Giúp mình nhé.
  (defun c:ccc ()
 (setq oldos (getvar "OSMODE"))
 (setq oldot (getvar "ORTHOMODE"))
 (setvar "OSMODE" 3)
 (setvar "ORTHOMODE" 0)
 (setvar "cmdecho" 0)
 (setq P1 (getpoint "\n Pick diem dau: "))
 (setq P2 (getpoint P1 "\n Pick diem cuoi: "))

 (if (< (cadr P1) (cadr P2))
   (progn (setq P0 P1) (setq goc (angle P1 P2)))
   (progn (setq P0 P2) (setq goc (angle P2 P1)))
 )

 (setq	X1 (car P1)
Y1 (cadr P1)
 )
 (setq	X2 (car P2)
Y2 (cadr P2)
 )

 (setq P3 (list (/ (+ X1 X2) 2) (/ (+ Y1 Y2) 2) 0))

 (setq L (abs (- X1 X2)))
 (setq H (abs (- Y1 Y2)))
 (setq i (rtos (* (/ H L) 100) 2 2))
 (setq doc (/ (* goc 180) pi))
 (if (< doc 90)
	(progn
    	 	(setq P4 (polar P3 (+ goc (/ pi 2)) 0.5))
   	;(prompt "\n nho hon 90d")
)
	(progn
 	(setq P4 (polar P3 (- goc (/ pi 2)) 0.5))
 	(setq doc (- doc 180))
   	;(prompt "\n lon hon 90d")
)
 )
 (command ".circle" P4 0.5)

 (setvar "OSMODE" oldos)
 (setvar "ORTHOMODE" oldot)
 (princ)
)

 

link bản vẽ http://www.cadviet.com/upfiles/3/drawing1_35.dwg

Bạn sửa dòng này (setvar "OSMODE" 3) thành (setvar "OSMODE" 1). Vì (setvar "OSMODE" 3) bắt cả điểm midpoint nên đường tròn nó dính vào điểm giữa của đường thẳng. Nếu không muốn sửa dòng (setvar "OSMODE" 3) thì bạn thêm dòng (setvar "OSMODE" 0) sau dòng (setq P2 (getpoint P1 "\n Pick diem cuoi: "))

  • 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
Em mới tham gia diễn đàn gần đây thôi em thấy rất hay rất có ích cho bản thân em giúp em rất nhiều trong công việc kiến thức cad của em được cải thiện rất rõ.

em nói vòng vòng để mong được sự giúp đỡ của các bác trên đàn đó hê hê! em muốn thỉnh giáo các bác vấn đề này đây

http://www.cadviet.com/upfiles/3/to44.dwg

Bạn yêu cầu gì mà khoai thế. Mình viết cho bạn được thế này bạn test thử và cho ý kiến để hoàn thiện

(defun c:cthua ()
(vl-load-com)
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (while (setq p (getpoint "\nPick vao vi tri thua muon trich do: "))
   (command "boundary" p "")
   (command "area" "o" (setq el1 (entlast)))
   (setq of (/ (sqrt (getvar "area")) 6))
   (setq ranp (car (acet-geom-vertex-list el1)))
   (setq pout (polar p (angle p ranp) (+ (distance p ranp) of)))
   (command "offset" of el1 pout "")
   (setq el2 (entlast))
   (acet-ss-zoom-extents (acet-list-to-ss (list el2)))
   (setq lsp (acet-geom-vertex-list el2))
   (setq ss (ssget "cp" lsp))
   (setq ss (ssdel el1 ss))
   (setq ss (ssdel el2 ss))
   (command "zoom" "p")
   (command "copy" ss "" p (setq pm (getpoint "\nPick vao vi tri can chen")) "")
   (command "move" el1 el2 "" p pm)
   (command "offset" 1 el2 p "")
   (setq el3 (entlast))
   (setq lsf (acet-geom-vertex-list el3))
   (setq i 0)
   (command "trim" el2 "" "f")
   (repeat (length lsf)
     (command (nth i lsf))
     (setq i (1+ i))
     )
   (command "" "")
   (entdel el1)
   (entdel el2)
   (entdel el3)
   (setq dk (getstring "\nTrich thua da hoan thanh. ban co muon tiep tuc khong: [Co/Khong]: < Co >: "))
   (if (or (= (strcase dk) "C") (= dk "")) (setq p T) (setq p nil))
   )
 (setvar "osmode" oldos)
 )

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 sửa dòng này (setvar "OSMODE" 3) thành (setvar "OSMODE" 1). Vì (setvar "OSMODE" 3) bắt cả điểm midpoint nên đường tròn nó dính vào điểm giữa của đường thẳng. Nếu không muốn sửa dòng (setvar "OSMODE" 3) thì bạn thêm dòng (setvar "OSMODE" 0) sau dòng (setq P2 (getpoint P1 "\n Pick diem cuoi: "))

Cám ơn bạn mình làm theo bạn và đã sửa được lỗi đó rồi, cho mình hỏi thêm là tại sao biến OSMODE chỉ là để mình phục vụ bắt điểm còn trong TH này thì mình đã khai báo rất rõ điểm P4 là tâm đường tròn mà sao nó lại bắt nhầm vào điểm MID kia đượ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
Cám ơn bạn mình làm theo bạn và đã sửa được lỗi đó rồi, cho mình hỏi thêm là tại sao biến OSMODE chỉ là để mình phục vụ bắt điểm còn trong TH này thì mình đã khai báo rất rõ điểm P4 là tâm đường tròn mà sao nó lại bắt nhầm vào điểm MID kia được nhỉ?

Do vùng truy bắt điểm của bạn nó lớn hơn cái bán kính đường tròn bạn a. Nếu bạn zoom to lên thì không bị như 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
Cho em đóng góp ý kiến thêm nge anh phamngoctu http://www.cadviet.com/upfiles/3/to44m.dwg

Cái yêu cầu này của bạn thật sự rất khó vì các text đó sắp xếp không theo quy luật nào cả mình cũng đang nghĩ thuật toán đó tù trước rồi nhưng hiện giờ chưa nghĩ ra cách. Bạn chịu khó đợi 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
Bạn thử lại cái này xem sao:

;; free lisp from cadviet.com

(defun c:bao ()
(vl-load-com)
(setq ss (ssget))
(if (= (tblsearch "block" "b_temp") nil)
(command "block" "b_temp" "0,0" ss "")
(command "block" "b_temp" "y" "0,0" ss "")
)
(command "-insert" "b_temp" "0,0" "" "" "")
(setq rec (acet-ent-geomextents (setq el (entlast))))
(setq p1 (car rec))
(setq p2 (cadr rec))
(setq p1 (polar p1 (+ (/ pi 4) pi) 50))
(setq p2 (polar p2 (/ pi 4) 50))
(setq p (polar p1 (/ pi 4) 25))
(command "rectang" p1 p2)
(setq el1 (entlast))
(command "boundary" p ""
(if (/= (getvar "cmdactive") 0)
(alert "khong tao duoc duong bao ban hay kiem tra lai hinh ve")
)
)
(command "erase" el1 "")
(setq ss (ssget "w" p1 p2 (list (cons 0 "LWPOLYLINE"))))
(command "change" ss "" "p" "c" "2" "")
(setq ss (acet-ss-to-list ss))
(setq lar (list))
(foreach n ss
(setq dt (dientich n))
(setq lar (append (list (list dt n)) lar))
)
(setq lar (vl-sort lar '(lambda (x y)
(> (car x) (car y))
)
)
)
(setq rm (cadr (cadr lar)))
(Setq ss (vl-remove rm ss))
(setq ss (acet-list-to-ss ss))
(command "erase" ss "")
(acet-explode el)
)
(defun dientich (name / are ob ll)
(command "region" name "")
(setq ob (vlax-ename->vla-object (setq ll (entlast))))
(setq are (vla-get-area ob))
(command "undo" 1)
are
)

Em chưa tạo được anh Tú ạ

http://www.cadviet.com/upfiles/3/filemau_1.dwg

hinhmau.jpg

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òn vấn đề này nữa muốn hỏi mọi người là tại sao nếu mình khai báo biến đầy đủ, ví dụ (defun C:ccc (/ P0 P1 P2) ...) thì khi theo dõi giá trị biến bằng aspect trong Visual Lisp lại không được, còn khi mình không khai báo rõ ràng (thành biến toàn cục) ví dụ (defun C:ccc () ...) thì lại sử dụng aspect đượ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
Em chưa tạo được anh Tú ạ

http://www.cadviet.com/upfiles/3/filemau_1.dwg

hinhmau.jpg

Tạo bình thường mà bạn. Trước khi tạo bạn phải xoá bỏ cái rectang bao ngoài và cái hình sản phẩm đi không thì lisp chay sai.

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ạo bình thường mà bạn. Trước khi tạo bạn phải xoá bỏ cái rectang bao ngoài và cái hình sản phẩm đi không thì lisp chay sai.

Được rồi anh Tú ạ

Bạn nào dùng thì down file của anh Tú về thử nhé

Cảm ơn anh

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
Cho em đóng góp ý kiến thêm nge anh phamngoctu http://www.cadviet.com/upfiles/3/to44m.dwg

Bạn dùng thử cái này. Do không tìm ra thuật toán để lọc các text không liên quan nên bạn chịu khó xoá bớt bằng tay. Anh em trên diễn đàn có ý nào hay thì sửa giúp bạn lacvanhoa nhé.

(defun c:cthua ()
 (vl-load-com)
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setq p T)
 (while p
   (setq p (getpoint "\nPick vao vi tri thua muon trich do: "))
   (command "boundary" p "")
   (command "area" "o" (setq el1 (entlast)))
   (setq of (/ (sqrt (getvar "area")) 6))
   (setq ranp (car (acet-geom-vertex-list el1)))
   (setq pout (polar p (angle p ranp) (+ (distance p ranp) of)))
   (command "offset" of el1 pout "")
   (setq el2 (entlast))
   (command "zoom" "e")
   (setq lsp (acet-geom-vertex-list el2))
   (setq ss (ssget "cp" lsp '((0 . "LINE,LWPOLYLINE"))))
   (setq ss (ssdel el1 ss))
   (setq ss (ssdel el2 ss))
   (command "copy" ss "" p (setq pm (getpoint "\nPick vao vi tri can chen")) "")
   (setq sstext (laytext el1 (* of 6) pm))
   (command "copy" sstext "" p pm "")
   (command "move" el1 el2 "" p pm)
   (command "offset" 1 el2 p "")
   (setq el3 (entlast))
   (setq lsf (acet-geom-vertex-list el3))
   (setq i 0)
   (repeat 2
   (command "trim" el2 "" "f")
   (repeat (length lsf)
     (command (nth i lsf))
     (setq i (1+ i))
     )
   (command "" "")
   )
   (entdel el1)
   (entdel el2)
   (entdel el3)
   (command "zoom" "p")
   (setq dk (getstring "\nTrich thua da hoan thanh. ban co muon tiep tuc khong: : [Co]: "))
   (if (or (= (strcase dk) "C") (= dk "")) (setq p T))
   (if (= (strcase dk) "K") (setq p nil))
   )
 (setvar "osmode" oldos)
 )
(defun laytext ( plk kc po / elt lstt)
 (command "offset" kc plk po "")
 (setq elt (entlast))
 (setq lstt (acet-geom-vertex-list elt))
 (setq sst (ssget "wp" lstt '((0 . "TEXT"))))
 (command "undo" 1)
 sst
 )

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 dùng thử cái này. Do không tìm ra thuật toán để lọc các text không liên quan nên bạn chịu khó xoá bớt bằng tay. Anh em trên diễn đàn có ý nào hay thì sửa giúp bạn lacvanhoa nhé.

;.....................

phamngoctukts thử lấy tọa độ của đường bao rồi gọi hàm ssget với tùy chọn "cp"

(setq lstt (acet-geom-vertex-list plk))

(setq sst (ssget "cp" lstt '((0 . "TEXT"))))

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.

×