Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
vantran

thay thế các đường tròn bằng block

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

các bạn cho mình hỏi trong cad có thể thay thế các đường tròn có sãn bằng block không. đây là file ví dụ của mình. http://www.cadviet.com/upfiles/3/vd1.dwg

Mình muốn hỏi thêm là vấn đề này có giải quyết bằng lisp được không. nếu được mong các bạn giúp mì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ác bạn cho mình hỏi trong cad có thể thay thế các đường tròn có sãn bằng block không. đây là file ví dụ của mình. http://www.cadviet.com/upfiles/3/vd1.dwg

Mình muốn hỏi thêm là vấn đề này có giải quyết bằng lisp được không. nếu được mong các bạn giúp mình

Điều này hoàn toàn được bạn cho mình chút thời gian mình sẽ 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
các bạn cho mình hỏi trong cad có thể thay thế các đường tròn có sãn bằng block không. đây là file ví dụ của mình. http://www.cadviet.com/upfiles/3/vd1.dwg

Mình muốn hỏi thêm là vấn đề này có giải quyết bằng lisp được không. nếu được mong các bạn giúp mình

Của bạn đây. lệnh là ctob

;; free lisp from cadviet.com
(defun c:ctob ()
(setq oldcmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq ss (ssget "x" '((0 . "circle"))))
(setq i 0)
(while (< 0 (sslength ss))
(setq ent (entget (ssname ss i))
tam (cdr (assoc 10 ent)))
(command "insert" "hk" tam "")
(setq i (1+ I))
)
(setvar "cmdecho" oldcmd)
)

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ủa bạn đây. lệnh là ctob

;; free lisp from cadviet.com
(defun c:ctob ()
(setq oldcmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq ss (ssget "x" '((0 . "circle"))))
(setq i 0)
(while (< 0 (sslength ss))
(setq ent (entget (ssname ss i))
tam (cdr (assoc 10 ent)))
(command "insert" "hk" tam "")
(setq i (1+ I))
)
(setvar "cmdecho" oldcmd)
)

[/quỏt

 

MÌnh đã thử cái lisp của bạn rổi nhưng nó chỉ thay được cho một đường tròn thôi. mình muốn là thây tất cả các đường tròn đó bởi block. giống như chức năng REPLACE ALL của lệnh FIND ấy. mong các bạn 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
MÌnh đã thử cái lisp của bạn rổi nhưng nó chỉ thay được cho một đường tròn thôi. mình muốn là thây tất cả các đường tròn đó bởi block. giống như chức năng REPLACE ALL của lệnh FIND ấy. mong các bạn giúp đỡ

Mình lúc test mình thiếu mất dấu "" bạn test lại xem

;; free lisp from cadviet.com

;; free lisp from cadviet.com
(defun c:ctob ()
(setq oldcmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq ss (ssget "x" '((0 . "circle"))))
(setq i 0)
(while (< 0 (sslength ss))
(setq ent (entget (ssname ss i))
tam (cdr (assoc 10 ent)))
(command "-insert" "hk" tam "" "" "")
(setq i (1+ I))
)
(setvar "cmdecho" oldcmd)
)

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 đã thử cái lisp của bạn rổi nhưng nó chỉ thay được cho một đường tròn thôi. mình muốn là thây tất cả các đường tròn đó bởi block. giống như chức năng REPLACE ALL của lệnh FIND ấy. mong các bạn giúp đỡ

Mình sửa lại giúp bạn rồi đây.

(defun c:ctob(/ ENT I SS TAM)
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
(setq ent (entget (ssname ss i))
tam (cdr (assoc 10 ent)))
(entmake (list  (cons 0 "INSERT")(cons 2 "hk") (cons 10 tam)))
(entmake (list (cons 0 "SEQEND")))
(setq i (1+ i))
)
(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ũng làm thử 1 cái,

cái này chọn circle nào thì no' insert lên circle đó

 

(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:isb (/ cir i OldOs tam)
(BatDauVe)
(setq i 0)
(setq ss (ssget '((0 . "*CIRCLE"))))
     (while (< i (sslength ss))
  (setq cir (ssname ss i))
  (setq tam (cdr (assoc 10 (entget cir))))
 (command "-INSERT" "hk" tam "" "" "")
 (setq i (1+ i))
);_ end while
(KetThucVe)
);_ end defun

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

Hay quá,nhưng hình như các code không chú ý đến khoản hiện dialog block name để người dùng chọn block thay thế,hoặc đơn giản hơn là thêm 1 biến lấy tên clock do người dùng kick chọn nhỉ ^^.E nghĩ như thế thì trọn vẹn hơ là cố định tên nó trong 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 cũng làm thử 1 cái,

cái này chọn circle nào thì no' insert lên circle đó

 

(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:isb (/ cir i OldOs tam)
(BatDauVe)
(setq i 0)
(setq ss (ssget '((0 . "*CIRCLE"))))
     (while (< i (sslength ss))
  (setq cir (ssname ss i))
  (setq tam (cdr (assoc 10 (entget cir))))
 (command "-INSERT" "hk" tam "" "" "")
 (setq i (1+ i))
);_ end while
(KetThucVe)
);_ end defun

mình đã thử ctob.lsp và isb.lsp và cho kết quả đúng như mình mong muổn. mình có ý kiến là nếu như lisp không cố định block mà có thể chọn bất cứ block nào thì hay quá. Ngoài ra mình thấy trong ctob.lsp khi thay đường tròn bằng block thì nó sẽ thay thế tất cả các đường tròn, nhưng điều này đã được khắc phục trong isb.lsp. nếu có thể kết hợp thêm tính năng chọn block thì tuyệt quá. một lần nữa xin cảm ơn hai bạn đã 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
mình đã thử ctob.lsp và isb.lsp và cho kết quả đúng như mình mong muổn. mình có ý kiến là nếu như lisp không cố định block mà có thể chọn bất cứ block nào thì hay quá. Ngoài ra mình thấy trong ctob.lsp khi thay đường tròn bằng block thì nó sẽ thay thế tất cả các đường tròn, nhưng điều này đã được khắc phục trong isb.lsp. nếu có thể kết hợp thêm tính năng chọn block thì tuyệt quá. một lần nữa xin cảm ơn hai bạn đã giúp đỡ

Của bạn đây. Đúng ý bạn rồi nhé. Chọn đường chòn trước rồi chọn block muốn chèn.

;; free lisp from cadviet.com
(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:isb (/ cir i OldOs tam)
(BatDauVe)
(setq i 0)
(princ "\nchon cuong chon muon insert")
(setq ss (ssget '((0 . "*CIRCLE"))))
(setq ten (cdr (assoc 2 (entget (car (entsel "chon block muon chen")))))
)
     (while (< i (sslength ss))
  (setq cir (ssname ss i))
  (setq tam (cdr (assoc 10 (entget cir))))
 (command "-INSERT" ten tam "" "" "")
 (setq i (1+ i))
);_ end while
(KetThucVe)
);_ end defun

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à một bài toán mà nhiều lời giải ghê. Nhất bạn đấy chỉ trong thời gian ngắn mà nhiều người giúp bạn 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
Chà một bài toán mà nhiều lời giải ghê. Nhất bạn đấy chỉ trong thời gian ngắn mà nhiều người giúp bạn vậy :(

Tại dạo này ít người yêu cầu viết lisp quá nên anh em rả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
Chà một bài toán mà nhiều lời giải ghê. Nhất bạn đấy chỉ trong thời gian ngắn mà nhiều người giúp bạn vậy :(

Tại mình đang tập toẹ nên cũng thử viết. hehe

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ại dạo này ít người yêu cầu viết lisp quá nên anh em rảnh rỗi.

Còn cái tường kia kìa >:( :(

Viết nhiều lisp nhỏ nhỏ thích hơn là 1 thằng thật lớn,bác nhỉ.Mệt đầu kinh

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òn cái tường kia kìa >:( :(

Viết nhiều lisp nhỏ nhỏ thích hơn là 1 thằng thật lớn,bác nhỉ.Mệt đầu kinh

ketxu cho mình hỏi cái> vẽ theo tỉ lệ là thế nào. Có phải thê này không

ví dụ tỉ lệ 1/100 khi nhập dày tường là 220 thì trên bản vẽ là 2.2 đúng không. vì mình là dân kiến trúc nên ít dùng cái này. Bạn nói cụ thể tác dụng của 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

Dạ đúng là thế rồi đấy ạ.Ví dụ vẽ tỉ lệ 1/100 thì tất cả các kick thước lúc mình nhập vào đều chia cho 100.Vẽ cạnh dài 1000mm thì nhập vào 10 thôi-->khi in ra giấy nó cũng bằng 10mm.Sau đó lúc dim thì tạo 1 dimstyle với scale factor là 100,thì lúc mình dim cái đoạn thực 10mm ấy,nó sẽ hiện ra là 1000mm ạ.Dân vẽ model phải vẽ thế ạ(khá mỏi tay vì mỗi lần nhập lại phải thêm dòng /tle).Vẽ layout thì không cần đặt cái này, nhưng lại phải chú ý đến khoản đặt hightext và scale over để viewport chuẩn.Nói chung mỗi cái có 1 cái lợi.Vì e dùng cad2007 nên cũng chỉ biết thế,cad đời sau chắc không nhất thiết phải thế ^^.Hiện tại lúc vẽ kêt cấu BT thì e vẽ model,sang vẽ thép thì vẽ layout,vẫn kết hợp cả 2 cá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
Của bạn đây. Đúng ý bạn rồi nhé. Chọn đường chòn trước rồi chọn block muốn chèn.

;; free lisp from cadviet.com
(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:isb (/ cir i OldOs tam)
(BatDauVe)
(setq i 0)
(princ "\nchon cuong chon muon insert")
(setq ss (ssget '((0 . "*CIRCLE"))))
(setq ten (cdr (assoc 2 (entget (car (entsel "chon block muon chen")))))
)
     (while (< i (sslength ss))
  (setq cir (ssname ss i))
  (setq tam (cdr (assoc 10 (entget cir))))
 (command "-INSERT" ten tam "" "" "")
 (setq i (1+ i))
);_ end while
(KetThucVe)
);_ end defun

một lần nữa xin cảm ơn các bạn. vì mình là dân khảo sát nên việc sử dụng cad cũng là những lệnh cơ bản thôi nên còn hạn chế lắm. hy vọng sẽ học hỏi thêm đượ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ạn cho mình hỏi trong cad có thể thay thế các đường tròn có sãn bằng block không. đây là file ví dụ của mình. http://www.cadviet.com/upfiles/3/vd1.dwg

Mình muốn hỏi thêm là vấn đề này có giải quyết bằng lisp được không. nếu được mong các bạn giúp mình

Lisp thay thế các đường tròn có sẵn bằng Block.

Tương tự các lisp trên, có bổ sung hộp thoại chọn Block : với tùy chọn xóa Circle.

 

insblk.jpg

 

(defun c:InsBlk (/ blk_list BlkNam dcflag ss)
;|  By : Gia Bach, gia_bach @  www.CadViet.com             |;  
 (defun GetBlkLst(/ name tbl tbl_lst)
   (setq tbl (tblnext "block" T))
   (while tbl
     (if (/= (substr (setq name (cdr (assoc 2 tbl))) 1 1) "*")
(setq tbl_lst (cons name tbl_lst)))
     (setq tbl (tblnext "block"))  )
   (vl-sort tbl_lst '<))
 (defun delCir_set ()
   (if (= "1" (get_tile "delCir")) (setq delCir 1)(setq delCir 0)) ) 
 (defun Dialog_Show (lst / dxfdcl fn dxf_id)
   (setq dxfdcl (vl-filename-mktemp "InsBlk.tmp")
  fn (open dxfdcl "w"))
   (foreach item (list
	    "InsBlk : dialog {label=\"Insert Block\";"
	    "       : popup_list  {key =\"BlkLst\"; label=\"Select Block\"; width = 15; height = 15;}"
	    "       : toggle   {key =\"delCir\"; label=\"Delete Circle\"; value=\"0\";}"
	    "         ok_cancel; }")
     (princ item fn) )
   (close fn)
   (setq dxf_id (load_dialog dxfdcl))
   (if (not (if dxfXY (new_dialog "InsBlk" dxf_id "" dxfXY)(new_dialog "InsBlk" dxf_id)))
     (progn (prompt "\nKhong thay hop thoai.")(exit)))
   (start_list "BlkLst" 3) (mapcar 'add_list lst) (end_list)
   (action_tile "BlkLst" "(setq BlkNam (nth (atoi $value) lst))")
   (action_tile "delCir" "(delCir_set)")
   (action_tile "accept" "(setq dxfXY (done_dialog 1))")
   (setq dcflag (start_dialog))
   (unload_dialog dxf_id)
   (vl-file-delete dxfdcl)
   (princ))
;------- Main program ------------
 (setq delCir 0
blk_list (GetBlkLst)
BlkNam (nth 0 blk_list))
 (Dialog_Show blk_list)
 (if (= 1 dcflag)
   (if (setq ss (ssget '((0 . "CIRCLE"))));(8 . "HK")
     ((lambda (i / ent pt)
 (while (setq ent (ssname ss (setq i (1+ i))))
   (setq pt (cdr (assoc 10 (entget ent))))
   (entmake (list (cons 0 "INSERT")(cons 2 BlkNam) (cons 10 pt)))
   (entmake (list (cons 0 "SEQEND")))
   (if (= delCir 1) (entdel ent)))) -1)
   (alert "Nothing's Selected")))
 (princ)  )

Chỉnh sửa theo gia_bach
  • 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
Lisp thay thế các đường tròn có sẵn bằng Block.

Tương tự các lisp trên, có bổ sung hộp thoại chọn Block : với tùy chọn xóa Circle.

 

To Lisper : Mới "mót" đuợc điệu nhảy Lam-ba-da (lambda)

Điệu nhảy này "quay cuồng" ra phết đấy!

Sử dụng thành thạo điệu nhảy Lam-ba-da sẽ giúp code gọn gàng hơn.

...
((lambda (i / ent pt)
 (while (setq ent (ssname ss (setq i (1+ i))))
   (setq pt (cdr (assoc 10 (entget ent))))
   (entmake (list (cons 0 "INSERT")(cons 2 BlkNam) (cons 10 pt)))
   (entmake (list (cons 0 "SEQEND")))
   (if (= delCir 1) (entdel ent)))) -1)
...

Em thấy có cũng có gọn hơn chút nào đâu chỉ khác là tự động gán i = -1 thôi mà!? :(

  • 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 thấy có cũng có gọn hơn chút nào đâu chỉ khác là tự động gán i = -1 thôi mà!? :(
thanks master_worse.

ơ hay , sao bữa nay đãng trí 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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×