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 [phần 2]

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

Vấn đề là bạn đã giải quyết được cái sự thiếu àm đó chưa.Bạn dùng nguyên cái H2 xem nó có đc k ?

e chuyển sang dùng nguyên lisp h2 rồi !!! ngon lành cành đào bác ah...mèo trắng mèo đen ko quan trọng,miễn sao la bắt dc ... chuột la dc muh :D thanks bac heh

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 giúp em 2 lisp nhỏ này với :

1.Khi trích xuất 1 vùng ghi chú, ta tạo 1Hình chữ nhật khoanh vùng hình đám mây (như đoạn gom lời thoại ý), có lisp nào vẽ nhanh đường này một cách đều đặn hoặc chọn hình chữ nhật có sẵn thì nó tạo ra luôn không ạ ?

2.Lisp tạo Block Annonymos với điểm chèn do ta chỉ định

Thanks các bác 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

nhờ anh Hoành viết dùm cái lisp : mình có một miếng hatch ,vẽ thêm một nét cắt ngang miếng hatch đó. khi ta chọn nét đó thì miếng hatch bị chia làm 2 phần.

Đối tượng hatch không phải là đơn giản, cũng như yêu cầu của bạn có thể là rất khó cho việc xác định biên hatch. Nếu là đối tượng hatch trong 1 miền kín thì bạn dùng tạm cái này, mình viết theo ý tưởng đơn giản nhất, không lường các trường hợp "miếng hatch" của bạn phức tạp, biên hở, hatch chồng... Khó hơn thì bạn cứ chờ các bác khác góp ý tưởng nhé.

Với lisp này thì bạn quét chọn vùng hatch,cho 2 điểm thuộc biên để tạo đường cắt.Chúc bạn thành công

(defun c:brh(/ ss hObj 1st 2nd mpt oOs lpt rpt)
(setq   oOs (getvar "osmode"))
(setvar "osmode" 32)
(setq 	ss (ssget ":S" '((0 . "HATCH")))
	hObj (ssname ss 0)
	1st (getpoint "\n Diem thu nhat : ")
	2nd (getpoint 1st "\n Diem thu 2: ")
	mpt (mapcar '+ 1st 2nd)
    mpt (mapcar '* mpt '(0.5 0.5 0.5))		
)
(setvar "osmode" 0)
(setq   lpt (mapcar '- mpt '(1 0 0))
	rpt (mapcar '+ mpt '(1 0 0))
	)
	(command "-hatch" lpt "" "_MATCHPROP" hObj (entlast) "")
	(command "-hatch" rpt "" "_MATCHPROP" hObj (entlast) "")
	(entdel hObj)
(setvar "osmode" oOs)	
)

  • 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ác bác giúp em 2 lisp nhỏ này với :

1.Khi trích xuất 1 vùng ghi chú, ta tạo 1Hình chữ nhật khoanh vùng hình đám mây (như đoạn gom lời thoại ý), có lisp nào vẽ nhanh đường này một cách đều đặn hoặc chọn hình chữ nhật có sẵn thì nó tạo ra luôn không ạ ?

.....

Thanks các bác rất nhiều ạ

Nếu Tue_NV không nhầm, thì lệnh revcloud sẽ giải quyết vấn đề trên của bạn.

Bạn có thể tạo trước 1 Hình chữ nhật rồi Thực thi lệnh revcloud.

 

Nếu mình hiểu sai, thì phiền bạn upload file .dwg thể hiện kết quả bạn muốn lên đây nhé

  • 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âng, chính xác rồi đó ạ.Nhưng với yêu cầu revcloud hàng loạt và vẽ 1 đối tượng mới thì sao ạ ?Và block nặc danh ?

Bạn sử dụng cái này thử nhé :

(defun c:mrev(/ ss e)
 (if (setq ss (ssget '((0 . "*LINE"))) i -1)
   (while (setq e (ssname ss (setq i (1+ i))))
   	(command "revcloud" "O" e "n") )
 )
)

Bạn định trước Arc Length trong lệnh revcloud

 

Command: _revcloud

Minimum arc length: 4.6897 Maximum arc length: 4.6897 Style: Normal

Specify start point or [Arc length/Object/Style] <Object>: A

 

Specify minimum length of arc <4.6897>: 5

 

Specify maximum length of arc <5.0000>: 5

 

Specify start point or [Arc length/Object/Style] <Object>:

 

Select object: *Cancel*

-------

Block không có tên với điểm chèn do ta chỉ định thì sử dụng lệnh Copybase (Ctrol+Shift+C) và pasteblock (Ctrol+Shift+V)

  • 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

Với yêu cầu chọn đối tượng thì không khó, còn vẽ đối tượng mới bạn phải nhập đầy đủ tên lệnh :

Khác với bác Tuệ mình đặt bán kính bên trong thao tác, nếu dài bạn có thể bỏ đi để gọn hơn

 

(defun C:CLD ()
(vl-load-com)
(command "_undo" "Be")
(initget "C V")
(setq ans (getkword "\nChon / Ve moi [Chon / Ve moi] :"))
(if (or (= ans "C") (= ans nil))
(progn
(setq ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
     aleng (getdist "\nBan kinh : ")
  lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
)
(foreach x lst
	(command "_.revcloud" "_A" aleng "" "_O" x "")
)
(princ)
);end progn 1
(progn	
(command (getstring "\n Nhap lenh ve : "))	
(while (< 0 (getvar "CMDACTIVE"))(command pause))
(setq e_get (entget (entlast))
	  e_type (cdr (assoc '0 e_get)))
   (if (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
	(progn ;progn sub2-1
		(setq aleng (getdist "\nBan kinh : "))
		(command "_.revcloud" "_A" aleng "" "_O" (entlast) "")
	);end progn sub2-1
	(alert "\n Doi tuong cuoi cung khong the chuyen thanh dang cloud ")
)
);end progn 2
);end if
(command "undo" "en")
)

 

@Bác Tuệ : Block làm theo cách đó không phải là block nặc danh ạ, và nó vẫn hiện trong bảng chèn block

 

@Lispers : Giúp giùm em, trong code viết bên trên e vẫn lấn cấn phần vẽ mới.Khi ta gửi đi dòng (command "...") thì phần ".." chỉ nhận lệnh gốc của CAD.Nhưng ví dụ nhiều người đặt Line thành L trong acad.pgp thì không thể nhập L trong đối số cho lệnh command được ..E sử dụng method sendkey cũng không được như ý, vì không hãm được (sau khi sendkey thì phải thực hiện lệnh tương ứng nữa).Có bác nào có giải pháp nào giúp e k ạ?

Và E nhớ có bác nói đến lệnh biến lệnh lisp thành lệnh của cad, có thể dùng trong (command...) mà tìm không thấy

  • 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

 

@Lispers : Giúp giùm em, trong code viết bên trên e vẫn lấn cấn phần vẽ mới.Khi ta gửi đi dòng (command "...") thì phần ".." chỉ nhận lệnh gốc của CAD.Nhưng ví dụ nhiều người đặt Line thành L trong acad.pgp thì không thể nhập L trong đối số cho lệnh command được ..E sử dụng method sendkey cũng không được như ý, vì không hãm được (sau khi sendkey thì phải thực hiện lệnh tương ứng nữa).Có bác nào có giải pháp nào giúp e k ạ?

Và E nhớ có bác nói đến lệnh biến lệnh lisp thành lệnh của cad, có thể dùng trong (command...) mà tìm không thấy

Bạn tìm hiểu và nghiên cứu hàm vlax-add-cmd và hàm vlax-remove-cmd nhé :rolleyes:

  • 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

Block không có tên với điểm chèn do ta chỉ định thì sử dụng lệnh Copybase (Ctrol+Shift+C) và pasteblock (Ctrol+Shift+V)

Cả 2 lisp trên đều dùng ổn các bác ạ. Còn cái block ý em là block có dấu * ở trướ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

Bạn tìm hiểu và nghiên cứu hàm vlax-add-cmd và hàm vlax-remove-cmd nhé :rolleyes:

Tks bác.E thử nghiên cứu thấy thực chất hàm này cho phép nhập tên defun trục tiếp trong dòng commandline của CAd nhưng cũng không cho phép sử dụng trong (command...) của lisp hay (vl-cmdf ...) cuar Vlisp .Lạ thật ^^

E thử cả 2 hướng sendkey và reactor n vẫn thất bại, thôi đành tạm hài lòng với lisp trê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

Mình mới tham gia diễn đàn! Mong dc mọi người giúp đỡ!

 

Xin nhờ anh Hoành viết hộ 1 đoạn lisp!

 

 

Mình có 1 đương 3d poLYLINE , bây giờ mình muốn lisp cấy điểm tự động trên đường 3dpoLYLINE đó!( khi cấy điểm sẽ lisp sẽ hỏi khoảng cách cấy điểm là bao nhiêu : vd 1m, 2m, ...nói chung là cấy với khoảng cách bất kỳ, và các điểm cấy mới được đưa vào layer mới)

 

Mình rất mong được giúp đỡ, thanks anh 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ả 2 lisp trên đều dùng ổn các bác ạ. Còn cái block ý em là block có dấu * ở trước ý ạ

Bạn thử cái này xem sao :

;free lisp from cadviet.com posted @ ketxu
(defun c:AnB (/ sset pt ent)    
   (setq sset (ssget)    
	  pt (getpoint "\nDiem chen block : "))    
   (entmake
       (list   '(0 . "BLOCK")
               '(2 . "*anon")
               '(70 . 1)
               (cons '10 pt)
       )
   )       
( foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))                      
           (entmake (entget ent))
           (if (assoc 66 (entget ent))
               (progn                    
                   (setq subent (entnext ent))
                   (while (/= (cdr (assoc 0 (entget subent))) "SEQEND")
                       (entmake (entget subent))                
                       (setq subent (entnext subent))
                   )                    
                   (entmake (entget subent))
               )
           )            
           (entdel ent)
  	)    
   (entmake
       (list   '(0 . "INSERT")
               (cons '2 (entmake '( (0 . "endblk"))))
               (cons '10 pt)
       )
   )
(princ)
)

Mình mới tham gia diễn đàn! Mong dc mọi người giúp đỡ!

 

Xin nhờ anh Hoành viết hộ 1 đoạn lisp!

 

Mình rất mong được giúp đỡ, thanks anh nhiều ....!

Danh xưng bất nhất ^^ HỀ, mình thấy bài này là bài thứ 2 bạn post về yêu cầu này rồi, chắc có lẽ khó quá mà cũng hổng ai dám vượt qua rào cản trong bài post của bạn ^^ Mình nghĩ bạn nên đưa file CAD thể hiện ý tưởng lên diễn đàn xem sao. Chúc bạn thành công :)

  • 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

Nhờ anh em cao thủ viết dùm em cái lisp "sắp xếp trắc ngang". Mình làm bên GT mà cứ làm thủ công hơi vất vả, hôm có lisp nhưng mà áp dụng trên bản vẽ mình thì lại ko đc. Mong đc sự giúp đỡ của mọi người. 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

Đối tượng hatch không phải là đơn giản, cũng như yêu cầu của bạn có thể là rất khó cho việc xác định biên hatch. Nếu là đối tượng hatch trong 1 miền kín thì bạn dùng tạm cái này, mình viết theo ý tưởng đơn giản nhất, không lường các trường hợp "miếng hatch" của bạn phức tạp, biên hở, hatch chồng... Khó hơn thì bạn cứ chờ các bác khác góp ý tưởng nhé.

Với lisp này thì bạn quét chọn vùng hatch,cho 2 điểm thuộc biên để tạo đường cắt.Chúc bạn thành công

(defun c:brh(/ ss hObj 1st 2nd mpt oOs lpt rpt)
(setq   oOs (getvar "osmode"))
(setvar "osmode" 32)
(setq 	ss (ssget ":S" '((0 . "HATCH")))
	hObj (ssname ss 0)
	1st (getpoint "\n Diem thu nhat : ")
	2nd (getpoint 1st "\n Diem thu 2: ")
	mpt (mapcar '+ 1st 2nd)
    mpt (mapcar '* mpt '(0.5 0.5 0.5))		
)
(setvar "osmode" 0)
(setq   lpt (mapcar '- mpt '(1 0 0))
	rpt (mapcar '+ mpt '(1 0 0))
	)
	(command "-hatch" lpt "" "_MATCHPROP" hObj (entlast) "")
	(command "-hatch" rpt "" "_MATCHPROP" hObj (entlast) "")
	(entdel hObj)
(setvar "osmode" oOs)	
)

 

anh nói rõ dùm em chút. với lại sao down load ko được anh ơi. coi lại dùm em vớ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

anh nói rõ dùm em chút. với lại sao down load ko được anh ơi. coi lại dùm em với

Nói rõ là nói rõ cái j hả bạn ?? Cách dùng hay thuật toán hay khó khăn hay ... ???? Nếu không down được thì bạn copy code, hoặc quote lại bài của mình để lấy code, bật Notepad, paste vào đó và save AS thành 1 file lisp, ví dụ "bf.lsp" rồi load thô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

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

 

Gửi bác Hoành file ví dụ về cấy điểm tự động trên đường 3dply!

Mong bác và mọi người giúp đỡ!

 

Thanks.....

Hề hề hề,

Có phải bạn cần cái này không???

Hãy dùng thử và cho ý kiến xem cần chỉnh sửa thêm gì nhé.

(defun c:cd ( / pm tenlop lop en obj dis kc pt )
(vl-load-com)
(command "undo" "be")
(setq PM (getvar "pdmode"))
(setq tenlop (getstring t "\n Hay nhap ten layer ban muon: "))
(if (= (tblsearch "layer" tenlop) nil)
(command "layer" "n" tenlop "c" "1" tenlop "lt" "continuous" tenlop "")
)
(setq lop (getvar "clayer"))
(setvar "clayer" tenlop)
(setq en (car (entsel "\n Chon doi tuong 3dpolyline"))
       obj (vlax-ename->vla-object en)
       dis (vlax-curve-getdistatpoint obj (vlax-curve-getendpoint obj)))
(alert (strcat "\n Chieu dai duong 3dpolyline la " (rtos dis 2 2)))
(setq kc (getdist "\n Hay nhap khoang cach toi diem ban can cay: "))
(while (and (< kc dis) (> kc 0) (/= kc nil))
        (setq pt (vlax-curve-getpointatdist obj kc))
        (setvar "pdmode" 3)
        (command "point" pt )
       ;;;; (setvar "pdmode" pm)
        (setq kc (getdist "\n Hay nhap khoang cach toi diem ban can cay: "))
)
(setvar "clayer" lop)
(command "undo" "e")
(princ)
)

Chúc bạn vui.

  • 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

Thanks... bác phamthanhbinh! Nhưng khi minh chạy lisp lại bị báo lỗi như sau :

"

error: null function

(VL-LOAD-COM)

(C:CD)

*Cancel*"

 

 

Vì máy mình chạy sưu tầm cũng nhiều lisp! Không biết có phải do sung đột lisp ko!

Nếu được xin bác viết 1 lisp riêng chạy độc lập cấy điểm tự động trên đường 2dpoly gồm nhiều node!

Thanks và làm phiền 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

Thanks... bác phamthanhbinh! Nhưng khi minh chạy lisp lại bị báo lỗi như sau :

"

error: null function

(VL-LOAD-COM)

(C:CD)

*Cancel*"

 

 

Vì máy mình chạy sưu tầm cũng nhiều lisp! Không biết có phải do sung đột lisp ko!

Nếu được xin bác viết 1 lisp riêng chạy độc lập cấy điểm tự động trên đường 2dpoly gồm nhiều node!

Thanks và làm phiền bác nhiều...

Hề hề hề,

Cái vụ lỗi này lần đầu tiên mình gặp nên cũng không rõ nó bị sao nữa. Cái hàm (vl-load-com) là hàm dùng để tải các chức năng mở rộng của Autolisp sử dụng Visual Lisp. Nó có sẵn trong Help của CAD rồi nên hơi vô lý khi Cad của bạn không đọc được cái hàm này.

Trong lisp của mình đâu có cái hàm (C:CD) nào đâu mà chỉ có đoạn code (defun c:cd ( ) .... mà thôi. Đó là định nghĩa của cái hàm cd dược dùng như một lệnh trong CAD. Vậy nên có thể việc bạn tải hay copy cái lisp của mình có vấn đề bạn ạ. Hãy kiểm tra lại đoạn code bạn xài có đầy đủ như trong bài pót của mình hay không bạn nhé.

 

Theo mình hiểu thì cái lisp mình viết cũng dùng được cho việc cấy điểm lên các 2dPolyline đấy bạn ạ. Hãy kiểm tra lại code và dùng thử xem sao. Nếu vẫn không được thì có nhẽ CAd của bạn có vấn đề vì đoạn code trên mình dùng thử với bản vẽ bạn đã post thì hoàn toàn tốt bạn ạ.

Chúc bạn vui,

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ình xOá lệnh gọi hàm trong CAD thi chạy hàm trong Cad thi chạy dc lisp nhưng no lại báo lỗi tiếp như sau:

 

"

Hay nhap ten layer ban muon: CAY

Chon doi tuong 3dpolylineerror: null function

(VLAX-ENAME->VLA-OBJECT EN)

(SETQ EN (CAR (ENTSEL "\n Chon doi tuong 3dpolyline")) OBJ

(VLAX-ENAME->VLA-OBJECT EN) DIS (VLAX-CURVE-GETDISTATPOINT OBJ

(VLAX-CURVE-GETENDPOINT OBJ)))

"

 

Mong bạn xem giùm mình!

 

Vì mình ko down dc file lisp trực tiếp từ diễn đàn, rất mong lúc bạn xem xong gửi cho mình theo địa chỉ mail : " buidung.cantona@yahoo.com " Thanks ...bạn 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

Thanks... bác phamthanhbinh! Nhưng khi minh chạy lisp lại bị báo lỗi như sau :

"

error: null function

(VL-LOAD-COM)

(C:CD)

*Cancel*"

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

nhưng no lại báo lỗi tiếp như sau:

"

Hay nhap ten layer ban muon: CAY

Chon doi tuong 3dpolylineerror: null function

(VLAX-ENAME->VLA-OBJECT EN)

..........

Tình hình có thể là applekangter đang sử dụng bản CAD rất là ư là xưa ?!

(không hỗ trợ Visual Lisp)

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

×