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

Ứng dụng LISP để vẽ bản vẽ kiến trúc (phần cơ bản)

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

Một bản vẽ mới được thiết lập. Vẫn những layer đó, vẫn những kiểu text đó, vẫn những kiểu dim đó...Bạn không cần thiết phải làm lại từ đầu vì quá mất thời gian. Vậy làm thế nào???

 

( Tất cả các LISP CODE bạn chỉ việc copy rồi save ra file cùng tên với lệnh lisp và có phần mở rộng la .LSP (ví dụ: TaoL.LSP) là ok :lol: )

 

Bài 1: Tạo Layer

 

(defun c:TaoL()  (command "layer" "m" "!tuong" "c" "2" "" "")  (command "layer" "m" "!tim" "c" "1" "" "")  (command "layer" "m" "!thay" "c" "7" "" "")  (command "layer" "m" "!noithat" "c" "8" "" "")  (command "layer" "m" "!hatch" "c" "8" "" "")  (command "layer" "m" "!chu" "c" "3" "" "")  (command "layer" "m" "!kichthuoc" "c" "8" "" "")  (princ)  )

Với lisp này lệnh để tạo layer sẽ là TaoL.

 

Bài 2: Tạo Text Style ( kiểu chữ )

 

(defun c:TaoC()  (command "style" "!vnAvanH" ".VnAvantH" "" "" "" "" "")  (princ))

Với lisp này lệnh để tạo kiểu chữ sẽ là TaoC.

 

Bài 3: Tạo Dim Style ( kiểu kích thước )

 

(defun c:TaoK (/ scl fcal scal );dmasz dexo dexo dtxt dgap dclre dclrt dsn ao ad obj)(vl-load-com)(setq scl (getstring "\nTY LE BAN VE: "))(setq fcal (atof (substr scl 1 1))) (setq scal (atof (substr scl 3 3))) (setq tyle (/ fcal scal))  (setq caochu (getint "\nCHIEU CAO CUA CHU: "))(setvar "DIMALTF" 25)(setvar "DIMALTTZ" 13) (setvar "DIMALTZ" 13) (setvar "DIMBLK" "ArchTick") (setvar "DIMBLK1" "ArchTick")(setvar "DIMBLK2" "ArchTick")(setvar "DIMASZ" (/ caochu 2))(setvar "DIMCEN" -50)  (setvar "DIMCLRD" 9)(setvar "DIMDLE" (/ caochu 2))(setvar "DIMTOFL" 1)(setvar "DIMDLI" 0)(setvar "DIMCLRE" 9)(setvar "DIMEXE" (/ caochu 2))(setvar "DIMEXO" 0)(setvar "DIMTMOVE" 2)(setvar "DIMLDRBLK" "ArchTick")(setvar "DIMDEC" 0)(setvar "DIMCLRT" 9)(setvar "DIMTXT" caochu)(setvar "DIMLFAC" TYLE) (setvar "DIMTIX" 1)(setvar "DIMTIH" 0)(setvar "DIMGAP" (/ caochu 2))(setvar "DIMTOH" 0)(setvar "DIMTAD" 1)(setvar "DIMTXSTY" "!vnAvanH")(setvar "DIMTDEC" 0)(setvar "DIMTZIN" 13)(setvar "DIMZIN" 13);-------------------------------------------------------------(setq dsn (getstring "\nTEN CUA KIEU DIM MOI: ")) (setq ao (vlax-get-acad-object)) (setq ad (vla-get-ActiveDocument ao)) (setq obj (vla-add (vla-get-dimstyles ad) dsn)) (vla-copyfrom Obj ad) (vla-put-activedimstyle ad Obj) (princ) )

Với lisp này lệnh để tạo kiểu kích thước sẽ là TaoK.

Các thông số cần nhập

1. Tỷ lệ bản vẽ: (Thường là 1/1, cũng có thể là 1/2 tùy vào kiểu dim bạn muốn tạo)

2. Chiều cao chữ: (Tùy thuộc vào bản vẽ của bạn)

3. Tên kiểu dim mới: (Nên đặt theo chiều cao của chữ)

  • Like 1
  • Vote tăng 20

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

Xong phần khởi động. Giờ là bắt đấu vẽ với LINE, với ARC...

- Ồ! những đường Line này sao không phải là PLINE nhỉ? Vừa dễ quản lý vừa nhẹ bản vẽ. Phải làm sao đây? BO lại à ? OH không !!!

 

Bài 4. Nối LINE và ARC thành PLINE

 

(defun c:nn (/ tdt ssdt sodt index)(defun ObjName (ssdt /)(cdr (assoc '0 (entget ssdt))))(defun MoPL (ssdt /)(= (cdr (assoc '70 (entget ssdt))) 0))(defun NoiPL (ssdt /)(if (MoPL ssdt)(command ".PEDIT" ssdt "J" "All" "" "X")))(defun NoiLC (ssdt /)(command ".PEDIT" ssdt "Y" "J" "All" "" "X"))(setqtdt (ssget)sodt (sslength tdt)index 0)(repeat sodt(setqssdt (ssname tdt index)index (1+ index))(if (or (= (Objname ssdt) "LWPOLYLINE")(= (Objname ssdt) "POLYLINE"))(NoiPL ssdt))(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))(NoiLC ssdt)))(princ))

Lệnh để nối LINE và ARC thành PLINE là nn

  • Vote tăng 9

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

Nhanh quá! Cái lisp NN kia giúp tôi đỡ được bao nhiêu công khi phải BO line thanh PLINE.

 

Giờ đến vễ cửa, cửa đi, cửa sổ... nhiều quá. Copy từ thư viện ra thì lại phải SCALE rồi làng nhằng LAYER không đúng với bản vẽ của mình ! Vậy thì co cách nào không nhỉ?

 

Bài 5: Vẽ cửa đi

 

;-------------------------------------------------------------------------------------;ve cua di 1 canh;-------------------------------------------------------------------------------------(defun c:c1 (/ p1 p2 p3 p4 p5 daicua x y)(setq osm (getvar "osmode"))  (setq	p1     (getpoint "\nHay vao diem goc cua: ")	p2     (getpoint p1 "\nHay vao diem mut cua: ")	p3     (getpoint p1 "\nHay vao huong cua: ")	daicua (distance p1 p2)	x      (car p1)	y      (car (cdr p1))	x      25	y      daicua	p4     (list x y)	p5     (list daicua 0)  )  (setvar "OSMODE" 0)  (if (l3d_khongthanghang p1 p2 p3)    (progn      (command ".UCS" "3" p1 p2 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")    )    (princ "\n3 diem nhap vao khong duoc thang hang")  )(setvar "osmode" osm)       );-------------------------------------------------------------------------------------;ve cua di 2 canh;-------------------------------------------------------------------------------------(defun c:c2 (/ p1 p2 p3 p4 p5 daicua x y)  (setq osm (getvar "osmode"))    (setq	p1     (getpoint "\nHay vao diem goc cua: ")	p2     (getpoint p1 "\nHay vao diem mut cua: ")	p3     (getpoint p1 "\nHay vao huong cua: ")	daicua (/ (distance p1 p2) 2.0)	x      (car p1)	y      (car (cdr p1))	x      25	y      daicua 	p4     (list x y)	p5     (list daicua 0)  )  (setvar "OSMODE" 0)  (if (l3d_khongthanghang p1 p2 p3)    (progn      (command ".UCS" "3" p1 p2 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")            (command ".UCS" "3" p2 p1 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")          )    (princ "\n3 diem nhap vao khong duoc thang hang")  )  (setvar "osmode" osm)       );-------------------------------------------------------------------------------------;ve cua di 4 canh;-------------------------------------------------------------------------------------(defun c:c4 (/ p1 p2 p3 p4 p5 daicua x y)  (setq osm (getvar "osmode"))      (setq	p1     (getpoint "\nHay vao diem goc cua: ")	p2     (getpoint p1 "\nHay vao diem mut cua: ")	p3     (getpoint p1 "\nHay vao huong cua: ")	daicua (/ (distance p1 p2) 4.0)	x      (car p1)	y      (car (cdr p1))	x      25	y      daicua 	p4     (list x y)	p5     (list daicua 0)  )  (setvar "OSMODE" 0)  (if (l3d_khongthanghang p1 p2 p3)    (progn            (setq diem1 (diemgiua p1 (diemgiua p1 p2)))      (setq diem2 (diemgiua p1 p2))      (setq diem3 (diemgiua p2 (diemgiua p1 p2)))      	      (command ".UCS" "3" p1 p2 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")            (command ".UCS" "3" diem1 p2 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)           (command ".UCS" "P")                  (command ".UCS" "3" p2 p1 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")      (command ".UCS" "3" diem3 p1 p3)      (command ".rectangle" "0,0" p4)      (command ".Arc" p5 "C" "0,0" p4)      (command ".UCS" "P")          )    (princ "\n3 diem nhap vao khong duoc thang hang")  )(setvar "osmode" osm)         );-----------------------------------------------------------------------------

Có 3 lệnh trong lisp này.

c1: vẽ cửa đi 1 cánh

c2: vẽ cửa đi 2 cánh

c4: vẽ cửa đi 4 cánh

 

Thế còn cửa sổ thì sao nhỉ ?

 

Bài 6: Vẽ cửa sổ

 

(defun c:w1(/ data_m l1 l2 p1 p2 check)(defun wd_import(/ p3 p4 p5 p6)    (setq data_m (ssget))    (setq p1 (getpoint "\nfirst point :") p2 (getpoint "\nsecond point :"))    (setq l1 nil l2 nil check 1)    (if (not (= nil data_m)) (progn        (setq l1 (entget (ssname data_m 0)))        (setq l2 (entget (ssname data_m 1)))        (if (or (= nil l1) (not (= "LINE" (cdr (assoc 0 l1))))) (setq check 0))        (if (or (= nil l2) (not (= "LINE" (cdr (assoc 0 l2))))) (setq check 0))        (if (not (= 0 (-(sslength data_m) 2))) (setq check 0))        (if (= 1 check) (progn            (setq p3 (cdr (assoc 10 l1))) (setq p3 (list (nth 0 p3) (nth 1 p3)))            (setq p4 (cdr (assoc 11 l1))) (setq p4 (list (nth 0 p4) (nth 1 p4)))            (setq p5 (cdr (assoc 10 l2))) (setq p5 (list (nth 0 p5) (nth 1 p5)))            (setq p6 (cdr (assoc 11 l2))) (setq p6 (list (nth 0 p6) (nth 1 p6)))            (if (not (= nil (inters p3 p4 p5 p6 nil))) (setq check 0))        ))    ) (setq check 0))    (princ))(defun wd_procced()(defun mkv(/ p3 p4 p5 p6 p7 p8 p9 ls1 ls2 getom ll1)    (setq p3 (cdr (assoc 10 l1)))     (setq p4 (cdr (assoc 11 l1)))     (setq p5 (cdr (assoc 10 l2)))     (setq p6 (cdr (assoc 11 l2)))     (if (> (abs (- (nth 1 p1) (nth 1 p3)))           (abs (- (nth 1 p3) (nth 1 p4))) ) (setq check 0))    (if (> (abs (- (nth 1 p1) (nth 1 p4)))           (abs (- (nth 1 p3) (nth 1 p4))) ) (setq check 0))    (if (> (abs (- (nth 1 p2) (nth 1 p5)))           (abs (- (nth 1 p5) (nth 1 p6))) ) (setq check 0))    (if (> (abs (- (nth 1 p2) (nth 1 p6)))           (abs (- (nth 1 p5) (nth 1 p6))) ) (setq check 0))    (if (= 0 check) (princ "\ninvalid data") (progn        (setq ls1 (arlst (list (nth 1 p1) (nth 1 p2) (nth 1 p3) (nth 1 p4) )));        (princ ls1)        (setq p7 (list (nth 0 p3) (nth 0 ls1) 0))        (setq p8 (list (nth 0 p3) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p3) (nth 3 ls1) 0))        (mkline p7 p8 l1)        (setq ls1 (arlst (list (nth 1 p1) (nth 1 p2) (nth 1 p5) (nth 1 p6) )));        (princ ls1)        (setq p7 (list (nth 0 p5) (nth 0 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p5) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 3 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 1 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 2 ls1) 0))        (mkline p7 p8 l1)        (setq getom (getvar "osmode"))        (setvar "osmode" 0)        (setq ls2 (arlst (list (nth 0 p3) (nth 0 p5))))        (setq p7 (list (nth 0 ls2) (nth 1 ls1) 0))        (setq p8 (list (nth 1 ls2) (nth 2 ls1) 0))        (setq ll1 (list            (cons 0 "line")            (cons 8 (getvar "clayer"))        ))                (drawrt2 p7 p8 ll1)        (setvar "osmode" getom)        (command "erase" data_m "")    ))    (princ))(defun mkh(/ p3 p4 p5 p6 p7 p8 p9 ls1 ls2 getom ll1)    (setq p3 (cdr (assoc 10 l1)))     (setq p4 (cdr (assoc 11 l1)))     (setq p5 (cdr (assoc 10 l2)))     (setq p6 (cdr (assoc 11 l2)))     (if (> (abs (- (nth 0 p1) (nth 0 p3)))           (abs (- (nth 0 p3) (nth 0 p4))) ) (setq check 0))    (if (> (abs (- (nth 0 p1) (nth 0 p4)))           (abs (- (nth 0 p3) (nth 0 p4))) ) (setq check 0))    (if (> (abs (- (nth 0 p2) (nth 0 p5)))           (abs (- (nth 0 p5) (nth 0 p6))) ) (setq check 0))    (if (> (abs (- (nth 0 p2) (nth 0 p6)))           (abs (- (nth 0 p5) (nth 0 p6))) ) (setq check 0))    (if (= 0 check) (princ "\ninvalid data") (progn                (setq ls1 (arlst (list (nth 0 p1) (nth 0 p2) (nth 0 p3) (nth 0 p4) )));        (princ ls1)        (setq p7 (list (nth 0 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p3) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 3 ls1) (nth 1 p3) 0))        (mkline p7 p8 l1)        (setq ls1 (arlst (list (nth 0 p1) (nth 0 p2) (nth 0 p5) (nth 0 p6) )));        (princ ls1)        (setq p7 (list (nth 0 ls1) (nth 1 p5) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p5) 0))        (setq p8 (list (nth 3 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 1 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 2 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq getom (getvar "osmode"))        (setvar "osmode" 0)        (setq ls2 (arlst (list (nth 1 p3) (nth 1 p5))))        (setq p7 (list (nth 1 ls1) (nth 0 ls2) 0))        (setq p8 (list (nth 2 ls1) (nth 1 ls2) 0))        (setq ll1 (list            (cons 0 "line")            (cons 8 (getvar "clayer"))        ))        (drawrt3 p7 p8 ll1)        (setvar "osmode" getom)        (command "erase" data_m "")    ))    (princ))    (setvar "cmdecho" 0) (command "undo" "mark") (setvar "cmdecho" 1)    (if (= 0 check) (princ "\ninvalid data") (progn        (if (< (abs (- (nth 0 (cdr (assoc 10 l1)))                       (nth 0 (cdr (assoc 11 l1))) )) 0.00001) (mkv))        (if (< (abs (- (nth 1 (cdr (assoc 10 l1)))                       (nth 1 (cdr (assoc 11 l1))) )) 0.00001) (mkh))            ))        (princ)    )    (wd_import)  	(ai_undo_push)    (wd_procced)  	(ai_undo_pop)	)(defun c:w2(/ data_m l1 l2 p1 p2 check)(defun wd_import(/ p3 p4 p5 p6)    (setq data_m (ssget))    (setq p1 (getpoint "\nfirst point :") p2 (getpoint "\nsecond point :"))    (setq l1 nil l2 nil check 1)    (if (not (= nil data_m)) (progn        (setq l1 (entget (ssname data_m 0)))        (setq l2 (entget (ssname data_m 1)))        (if (or (= nil l1) (not (= "LINE" (cdr (assoc 0 l1))))) (setq check 0))        (if (or (= nil l2) (not (= "LINE" (cdr (assoc 0 l2))))) (setq check 0))        (if (not (= 0 (-(sslength data_m) 2))) (setq check 0))        (if (= 1 check) (progn            (setq p3 (cdr (assoc 10 l1))) (setq p3 (list (nth 0 p3) (nth 1 p3)))            (setq p4 (cdr (assoc 11 l1))) (setq p4 (list (nth 0 p4) (nth 1 p4)))            (setq p5 (cdr (assoc 10 l2))) (setq p5 (list (nth 0 p5) (nth 1 p5)))            (setq p6 (cdr (assoc 11 l2))) (setq p6 (list (nth 0 p6) (nth 1 p6)))            (if (not (= nil (inters p3 p4 p5 p6 nil))) (setq check 0))        ))    ) (setq check 0))    (princ))(defun wd_procced()(defun mkv(/ p3 p4 p5 p6 p7 p8 p9 ls1 ls2 getom ll1)    (setq p3 (cdr (assoc 10 l1)))     (setq p4 (cdr (assoc 11 l1)))     (setq p5 (cdr (assoc 10 l2)))     (setq p6 (cdr (assoc 11 l2)))     (if (> (abs (- (nth 1 p1) (nth 1 p3)))           (abs (- (nth 1 p3) (nth 1 p4))) ) (setq check 0))    (if (> (abs (- (nth 1 p1) (nth 1 p4)))           (abs (- (nth 1 p3) (nth 1 p4))) ) (setq check 0))    (if (> (abs (- (nth 1 p2) (nth 1 p5)))           (abs (- (nth 1 p5) (nth 1 p6))) ) (setq check 0))    (if (> (abs (- (nth 1 p2) (nth 1 p6)))           (abs (- (nth 1 p5) (nth 1 p6))) ) (setq check 0))    (if (= 0 check) (princ "\ninvalid data") (progn        (setq ls1 (arlst (list (nth 1 p1) (nth 1 p2) (nth 1 p3) (nth 1 p4) )));        (princ ls1)        (setq p7 (list (nth 0 p3) (nth 0 ls1) 0))        (setq p8 (list (nth 0 p3) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p3) (nth 3 ls1) 0))        (mkline p7 p8 l1)        (setq ls1 (arlst (list (nth 1 p1) (nth 1 p2) (nth 1 p5) (nth 1 p6) )));        (princ ls1)        (setq p7 (list (nth 0 p5) (nth 0 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p5) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 3 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 1 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 1 ls1) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 0 p3) (nth 2 ls1) 0))        (setq p8 (list (nth 0 p5) (nth 2 ls1) 0))        (mkline p7 p8 l1)        (setq ls2 (arlst (list (nth 0 p3) (nth 0 p5))))                (setq ll1 (list            (cons 0 "line")            (cons 8 (getvar "clayer"))        ))				(if (< (nth 0 p1) (nth 0 ls2)) (progn        	(setq p7 (list (nth 0 ls2) (nth 1 ls1) 0))			(setq p8 (list (nth 1 ls2) (nth 2 ls1) 0))			(setq p7 (list (* (+ (nth 0 p7) (nth 0 p8)) 0.5) (nth 1 p7) 0))        	(drawrt2 p7 p8 ll1)			(setq p7 (list (- (nth 0 ls2) 70) (- (nth 1 ls1) 100) 0))			(setq p8 (list (- (nth 0 ls2) 70) (+ (nth 2 ls1) 100) 0))			(mkline p7 p8 ll1)			(setq p9 (list (+ (nth 0 p7) 70) (nth 1 p7) 0))			(mkline p7 p9 ll1)			(setq p9 (list (+ (nth 0 p8) 70) (nth 1 p8) 0))			(mkline p8 p9 ll1)	    )(progn		   	(setq p7 (list (nth 0 ls2) (nth 1 ls1) 0))			(setq p8 (list (nth 1 ls2) (nth 2 ls1) 0))			(setq p8 (list (* (+ (nth 0 p7) (nth 0 p8)) 0.5) (nth 1 p8) 0))        	(drawrt2 p7 p8 ll1)			(setq p7 (list (+ (nth 1 ls2) 70) (- (nth 1 ls1) 100) 0))			(setq p8 (list (+ (nth 1 ls2) 70) (+ (nth 2 ls1) 100) 0))			(mkline p7 p8 ll1)			(setq p9 (list (- (nth 0 p7) 70) (nth 1 p7) 0))			(mkline p7 p9 ll1)			(setq p9 (list (- (nth 0 p8) 70) (nth 1 p8) 0))			(mkline p8 p9 ll1)		))                (command "erase" data_m "")    ))    (princ))(defun mkh(/ p3 p4 p5 p6 p7 p8 p9 ls1 ls2 getom ll1)    (setq p3 (cdr (assoc 10 l1)))     (setq p4 (cdr (assoc 11 l1)))     (setq p5 (cdr (assoc 10 l2)))     (setq p6 (cdr (assoc 11 l2)))     (if (> (abs (- (nth 0 p1) (nth 0 p3)))           (abs (- (nth 0 p3) (nth 0 p4))) ) (setq check 0))    (if (> (abs (- (nth 0 p1) (nth 0 p4)))           (abs (- (nth 0 p3) (nth 0 p4))) ) (setq check 0))    (if (> (abs (- (nth 0 p2) (nth 0 p5)))           (abs (- (nth 0 p5) (nth 0 p6))) ) (setq check 0))    (if (> (abs (- (nth 0 p2) (nth 0 p6)))           (abs (- (nth 0 p5) (nth 0 p6))) ) (setq check 0))    (if (= 0 check) (princ "\ninvalid data") (progn                (setq ls1 (arlst (list (nth 0 p1) (nth 0 p2) (nth 0 p3) (nth 0 p4) )));        (princ ls1)        (setq p7 (list (nth 0 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p3) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 3 ls1) (nth 1 p3) 0))        (mkline p7 p8 l1)        (setq ls1 (arlst (list (nth 0 p1) (nth 0 p2) (nth 0 p5) (nth 0 p6) )));        (princ ls1)        (setq p7 (list (nth 0 ls1) (nth 1 p5) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p5) 0))        (setq p8 (list (nth 3 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 1 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 1 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)        (setq p7 (list (nth 2 ls1) (nth 1 p3) 0))        (setq p8 (list (nth 2 ls1) (nth 1 p5) 0))        (mkline p7 p8 l1)		(setq getom (getvar "osmode"))        (setvar "osmode" 0)				(setq ll1 (list	            (cons 0 "line")	            (cons 8 (getvar "clayer"))	        ))		(setq ls2 (arlst (list (nth 1 p3) (nth 1 p5))))		;(princ ls2)				(if (> (nth 1 p1) (nth 1 ls2)) (progn        	(setq p7 (list (nth 1 ls1) (nth 0 ls2) 0))        	(setq p8 (list (nth 2 ls1) (nth 1 ls2) 0))			(setq p8 (list (nth 2 ls1) (* (+ (nth 1 p7) (nth 1 p8)) 0.5) 0))		        	(drawrt3 p7 p8 ll1)			(setq p7 (list (- (nth 1 ls1) 100) (+ (nth 1 ls2) 70) 0))			(setq p8 (list (+ (nth 2 ls1) 100) (+ (nth 1 ls2) 70) 0))			(mkline p7 p8 ll1)			(setq p9 (list (nth 0 p7) (- (nth 1 p7) 70) 0))			(mkline p7 p9 ll1)			(setq p9 (list (nth 0 p8) (- (nth 1 p8) 70) 0))			(mkline p8 p9 ll1)		)(progn		  	(setq p7 (list (nth 1 ls1) (nth 0 ls2) 0))        	(setq p8 (list (nth 2 ls1) (nth 1 ls2) 0))			(setq p7 (list (nth 1 ls1) (* (+ (nth 1 p7) (nth 1 p8)) 0.5) 0))						(drawrt3 p7 p8 ll1)						(setq p7 (list (- (nth 1 ls1) 100) (- (nth 0 ls2) 70) 0))			(setq p8 (list (+ (nth 2 ls1) 100) (- (nth 0 ls2) 70) 0))			(mkline p7 p8 ll1)			(setq p9 (list (nth 0 p7) (+ (nth 1 p7) 70) 0))			(mkline p7 p9 ll1)			(setq p9 (list (nth 0 p8) (+ (nth 1 p8) 70) 0))			(mkline p8 p9 ll1)								))				(setvar "osmode" getom)	        (command "erase" data_m "")    ))    (princ))    (setvar "cmdecho" 0) (command "undo" "mark") (setvar "cmdecho" 1)    (if (= 0 check) (princ "\ninvalid data") (progn        (if (< (abs (- (nth 0 (cdr (assoc 10 l1)))                       (nth 0 (cdr (assoc 11 l1))) )) 0.00001) (mkv))        (if (< (abs (- (nth 1 (cdr (assoc 10 l1)))                       (nth 1 (cdr (assoc 11 l1))) )) 0.00001) (mkh))            ))        (princ)    )    (wd_import)    (wd_procced))

Có 2 lệnh trong lisp này.

w1: vẽ cửa sổ kiểu 1

w2: vẽ cửa sổ kiểu 2

  • Vote tăng 9

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ỉ tí quến. Thế khi vẽ tim và tường thì làm thế nào cho nhanh. Co người thì dùng MLine, co người thì dùng Line. MLine thì không bàn, nhanh, nhưng không phải ai cũng quen. Vậy làm thế nào khi đã ve xong tim tường rồi? OFFSET ?

 

Bài 7: Offset line sang 2 bên

 

(defun c:oo(/ data_m)(defun import_data(/ i)    (setq data_m (ssget))    (if (= nil distan_m) (setq distan_m 110.0))    (princ "Distance (")    (princ distan_m)    (princ "):")    (setq i (getreal ))    (if (not (= nil i)) (setq distan_m i)))(defun process(/ ent check)(defun p_check()    (setq check 0)    (if (= "LINE" (cdr (assoc 0 ent))) (setq check 1))    (princ))(defun p_d_offset(/ p1 p2 p3 p4)(defun makeline(/ e2 e5);    (princ ent);    (setq e5 nil);    (setq e5 (cdr (assoc 5 ent)));    (princ e5);    (if (= nil e5) (setq e5 ))    (setq la (list (cons 0 "LINE")        (cons 5 (cdr (assoc 5 ent)) )        (cons 8 (cdr (assoc 8 ent)) )        (cons 10 p3)        (cons 11 p4)    ));    (princ la)    (entmake la)    (princ))    (setq p1 (cdr (assoc 10 ent)) p2 (cdr (assoc 11 ent)) )    (if (not (= p1 p2)) (progn        (if (< (abs (- (nth 0 p1) (nth 0 p2))) 0.000001) (progn            (setq p3 (list (+ (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )            (setq p4 (list (+ (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )            (makeline)            (setq p3 (list (- (nth 0 p1) distan_m) (nth 1 p1) (nth 2 p1) ) )            (setq p4 (list (- (nth 0 p2) distan_m) (nth 1 p2) (nth 2 p2) ) )            (makeline)        ))        (if (< (abs (- (nth 1 p1) (nth 1 p2))) 0.000001) (progn            (setq p3 (list (nth 0 p1) (+ (nth 1 p1) distan_m) (nth 2 p1) ) )            (setq p4 (list (nth 0 p2) (+ (nth 1 p2) distan_m) (nth 2 p2) ) )            (makeline)            (setq p3 (list (nth 0 p1) (- (nth 1 p1) distan_m) (nth 2 p1) ) )            (setq p4 (list (nth 0 p2) (- (nth 1 p2) distan_m) (nth 2 p2) ) )            (makeline)        ))    ))    (princ))    (if (not (= nil data_m)) (progn        (setq i 0)        (while (< i (sslength data_m)) (progn            (setq ent (entget (ssname data_m i)))            (p_check)            (if (= 1 check) (p_d_offset))            (setq i (+ i 1))        ))    ))    (princ))    (import_data)  	(ai_undo_push)    (process)  	(ai_undo_pop)    (princ))

Lênh để offset line sang 2 bên là oo.

....

Còn lắm nhưng mà ăn cơm đã..hè hè

  • Like 1
  • Vote tăng 6

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 vẽ cũng ổn rồi. chuẩn bị viết TEXT và Dim thôi. Nhưng trước khi chuyển sang phần mới. Tôi muốn cho cho các bạn biết thêm 2 mẹo nữa khi vẽ.

 

Bài 8: Break đối tượng

Nhiều người sẽ bảo có lệnh Break (br) rồi cần gì LISP. Nhưng không! Lệnh BR thường không chặt điểm mà chặt đoạn nếu ta không cẩn trọng.

 

(defun c:bf (/ dt diem)  (setq	dt   (car (entsel "\nVao doi tuong can chat")))  (if dt    (progn      (redraw dt 3)        (setq diem (getpoint "\nVao diem chat: "))      (redraw dt 4)    )  )    (if (and dt diem)        (command ".break" dt diem diem)  )  )

Lệnh bf sẽ giúp ta chặt đối tượng tại một điểm.

 

Bài 9: Nối 2 đường Line bị ngặt quãng

Hãy tưởng tượng bạn có 1 đương Line. Bạn Br nó. Đường Line giờ đã trở thành 2 đường riêng biệt, cách nhau 1 đoạn. Không cần thiết phải xoa 1 đường và EX đường kia khi bạn muốn 2 đường làm 1.

 

(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    )  )  (init)  (setq    p1	  (getpoint "\ngocdau: ")    p2	  (getcorner p1 "\ngocsau: ")    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))	)      )            (traos)    )    (princ "\nKhong the noi line duoc !")  )  (done))

Lệnh jl rất tiện. Bạn thử dùng mà xem...

 

Hẹn gặp lại vào bài sau "Những Lisp sử dụng để hoàn thiện bản vẽ". Chúc các bạn vui vẻ

  • Vote tăng 5

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

Tiếp tục nào. Chán với mấy cái cửa, với mấy đường LINE rồi. Giờ ta Hatch nhé.

 

Bài 10: Hiệu chỉnh Hatch

 

(defun c:hc ()  	(setq elist	(entget (car (entsel "\nLUA CHON MAU HATCH DE SAO CHEP: ")))		etyp	(cdr (assoc 0 elist))		old 	(getvar "clayer")	);setq	(if (/= etyp "HATCH")		(prompt "\nKHONG PHAI DOI TUONG HATCH! HAY THU LAI!")		(progn			(setq layn (cdr (assoc 8 elist)))  			(setvar "HPNAME" (cdr (assoc 2 elist)))  			(setvar "HPSCALE" (cdr (assoc 41 elist)))  			(setvar "HPANG" (cdr (assoc 52 elist)))  			(setq pt1 (getpoint "\nCHON MOT DIEM TRONG VUNG SE HATCH: "))			(setvar "clayer" layn)  			(command "bhatch" pt1 "")			(setvar "clayer" old)		);progn	);if(princ));defun;****** mk ****** mk ****** mk ****** mk ****** mk ****** mk ******(defun c:hm ()  	(setq ename	(entsel "\nLUA CHON MAU HATCH DE DI CHUYEN: ")		elist (entget (car ename))		etyp	(cdr (assoc 0 elist))		old 	(getvar "clayer")	);setq	(if (/= etyp "HATCH")		(prompt "\nKHONG PHAI DOI TUONG HATCH! HAY THU LAI!")		(progn			(setq layn (cdr (assoc 8 elist)))  			(setvar "HPNAME" (cdr (assoc 2 elist)))  			(setvar "HPSCALE" (cdr (assoc 41 elist)))  			(setvar "HPANG" (cdr (assoc 52 elist)))  					        (setq pt1 (getpoint "\nCHON MOT DIEM TRONG VUNG SE HATCH: "))			(setvar "clayer" layn)			(entdel (car ename))  			(command "bhatch" pt1 "")			(setvar "clayer" old)		);progn	);if(princ));defun;****** mk ****** mk ****** mk ****** mk ****** mk ****** mk ******(defun c:ha		()  	(setq ename(entsel "\nLUA CHON MAU HATCH DE THAY DOI GOC : ")		elist(entget (car ename))		etyp(cdr (assoc 0 elist))		oang(assoc 52 elist)	);setq	(if (/= etyp "HATCH")		(prompt "\nKHONG PHAI DOI TUONG HATCH! HAY THU LAI!")		(progn		(setq ang  (getangle (strcat "\nSO DO GOC MOI <" (rtos (cdr oang) 2) ">:"))		nang (cons 52 ang)		nlst (subst nang oang elist)		)		(entmod nlst)		(command "hatchedit" ename "" "" "" "")		);progn	);if(princ));defun;****** mk ****** mk ****** mk ****** mk ****** mk ****** mk ******(defun c:hs		()  	(setq ename	(entsel "\nLUA CHON MAU HATCH DE THAY DOI TY LE : ")		elist (entget (car ename))		etyp	(cdr (assoc 0 elist))		oscl (assoc 41 elist)	);setq	(if (/= etyp "HATCH")		(prompt "\nKHONG PHAI DOI TUONG HATCH! HAY THU LAI!")		(progn		(setq hscl (getreal (strcat "\nTY LE MAU HATCH MOI <" (rtos (cdr oscl) 2) ">:"))					nscl (cons 41 hscl)					nlst (subst nscl oscl elist)			)		(entmod nlst)		(command "hatchedit" ename "" "" "" "")		);progn	);if(princ));defun

Trong lisp này cung cấp cho chúng ta những lện sau

1. hc: Copy Hatch

1. hm: Move Hatch

1. ha: Chỉnh góc của mấu Hatch

1. hs: Chỉnh độ Scale của mẫu Hatch

  • 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

Bài 11: Hiệu chỉnh Text

AutoDesk cung cấp cho chúng ta một lisp rất hây, nhưng lại được ít người quan tâm, và đây !

 

Lệnh cht giúp ta rất nhiều khi hiệu chỉnh chữ, ví dụ như chiều cao, góc...ta chẳng cần phải vào bảng thuộc tính (Ctrl+1) để sửa nữa, mọi thứ đều dùng dòng lệnh, nhanh hơn gấp bộ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

Thế đấy ! Giờ thì bản vẽ đã ổn thỏa. Chẳng còn gì để làm nữa. Nhưng với đống LISP kia thì sao nhỉ? Nhiều file *.LSP quá @_@. Làm gì?

 

Bài 12: Chuyển LSP sang VLX

Công cụ này thì cực hay. Vì từ hàng trăm file LSP ta có thể chuyển thành 1 file VLX, gọn, nhẹ, bảo mật cao hơn...

 

Posted Image

 

Các bước thực hiện.

 

Bước 1: Khởi động Cad, tại dòng Command nhập lệnh vlide.

 

Posted Image

 

Bước 2: Trong cửa sổ Visual Lisp for AutoCad, nhấn vào File/Make Application/New Application Wizard

 

Posted Image

 

Bước 3: Chọn Simple vầ nhấn Next

 

Posted Image

 

Bước 4: Lựa chọn đường dẫn (Application Location) và tên file (Application Name) Rồi nhấn Next

 

Posted Image

 

Bước 5: Nhấn vào nút Add, 1 cửa sổ chọn file hiện ra, select tất cả các file LSP, rồi nhấn Open

 

Posted Image

 

Bước 6: Các file LSP vừa lựa chọn được cập nhật và bảng danh sách, nhấn Next

 

Posted Image

 

Bước 7: Nhấn Finish để kết thúc.

 

Posted Image

 

Quá trình này kết thúc thành công bàng 1 thông báo hoàn thành

 

Posted Image

 

Ok. Giờ thì file VLX duy nhất đã được tạo ra, rất gọn, rất nhẹ và bảo mật cao hơn..0_0

 

Nếu bạn không muốn mất thời gian, có thể tải file vlxcoban.vlx tại đây:

 

http://thunglungden.org/cadviet/cad/lisp/v...an/vlxcoban.vlx

 

Kết thúc. Chúc các bạn thành công với bộ lisp cơ bản này. Hẹn gặp lại lần sau với một bộ lisp năng cao, phát huy hết các tính năng của CAD.

 

Chào thân ái ! :lol:

  • Like 1
  • Vote tăng 14

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

quá hay !nhưng lisp này giúp cho công việc của mình nhẹ nhàng và nhanh hơn gấp bội.nhất là các bài viết này gíup mình hiểu hơn về cad một công cụ mà mình dùng thường xuyê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ái này hay thật mình rất kết con này, bây h thì chỉ cần 1 file duy nhất.Nhưng mình thắc mắc có thể lấy file *.LSP từ trong file *.VLX không? nếu có thể bạn bày cách luôn nhé :lol:

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 đã convert sang VLX rồi tức là mã đã chuyển thành mã máy (kiểu file exe) nên không có cách nào chuyển trực tiệp được cả. Vẫn có cách chuyển nhưng không phải trực tiếp, mà những cách này thì phải dân IT mới làm được...

  • 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

Bác Jikibo oi! sao mấy cái đoạn CODE mà bác post lên, tôi copy lại, tạo file lisp mới rồi Paste vô, load vào acad nhưng lại không sử sử dụng được bác oi! Lúc tôi paste vào trong notepad các đoạn lệnh không nhảy cách dòng như trong bài post của bác vậy có phải là sai không hả bác! nhờ bác chỉ giáo thêm với, cám ơ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

Đúng thật. Vừa thử copy và paste sang notepad thì nó không còn chĩnh xác về các dấu xuống dòng nữa. Nhưng không sao. Để tiện cho sử dụng Ji đã compile 2 VLX rồi. Dừng luôn file VLX đó cho nhẹ...ok

  • Like 1
  • 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
Anh cho hỏi lúc chuyển file tu LSP sang VLX em ko select được tất cả các file SLP ma chỉ chọn được từng file một để chuyển đổi thôi.Em xai CAd 05

 

 

tôi gặp phải lỗi này khi sử dụng file vẽ cửa sổ = second point :; error: bad argument type: lentityp nil

và file vẽ cửa đi = Hay vao huong cua: ; error: no function definition: L3D_KHONGTHANGHANG

xin hướng dẫn cách khắc phụ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
Anh cho hỏi lúc chuyển file tu LSP sang VLX em ko select được tất cả các file SLP ma chỉ chọn được từng file một để chuyển đổi thôi.Em xai CAd 05

Cách bình thường là được nhiều file mà bạn!

Bạn có thể môt tả cách làm của bạn đượ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
tôi gặp phải lỗi này khi sử dụng file vẽ cửa sổ = second point :; error: bad argument type: lentityp nil

và file vẽ cửa đi = Hay vao huong cua: ; error: no function definition: L3D_KHONGTHANGHANG

xin hướng dẫn cách khắc phục

 

Lỗi này là khi bạn dùng 1 trong 3 lisp vẽ cửa đi (c1,c2,c4). Khi bạn chọn hướng của cửa, bạn phải chọn vào 1 trong mặt vùng được ngăn cách bằng đường thẳng nối từ 2 điểu đầu và cuối (vừa pick).

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 oi tôi copy doạn code này nhưng không thể chạy được vẻ cửa và cửa sổ

cả hai đoạn code trên đều báo lỗi là KHONGTHANGHANG

XIN ANH COI LAI VA CHI GIÙM TÔI NGHI DÂY LA PHẦN RẤT HAY VÀ TIỆN LỢI

  • 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

Pac Jikibo đã chỉ cách tạo các layer định sẵn bằng 1 lisp rồi, Pác chỉ em luôn cách đặt các thuộc tính cho layer với, vi du: layer "tim" em muốn nó là đường Center lun. Mong được chỉ giáo.

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

×