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ị

Bạn tham khảo cái này nhé:

;VE CAO TRINH
(DEFUN C:CT (/ CMD NBC OSM PT1 TSIZE STR PRMT)
(if (not (tblsearch "layer" "ghichu"))
(command "layer" "m" "ghichu" "c" "150" """")
)

(if (not (tblobjname "block" "CTrinh"))
 	(taobl)
)  	
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ NBC (GETVAR "CLAYER"))
(SETQ OSM (GETVAR "OSMODE"))
(SETVAR "CMDECHO" 0)(SETVAR "DIMZIN" 0)
(setvar "ATTMODE" 1)(setvar "attdia" 0)(setvar "attreq" 1)
(SETQ 	PT1 (GETPOINT "\nDiem cao trinh:"))
(if (not TSIZE1)
 	(SETQ	TSIZE1 (GETVAR "TEXTSIZE"))
 )	
(SETQ	STR (RTOS TSIZE1 2)
PRMT (STRCAT "\nText height <" STR ">:")
TSIZE (GETDIST PRMT)
)
(if (not TSIZE)
 (SETQ TSIZE TSIZE1)
 (SETQ TSIZE1 TSIZE)
)  
(PRINC "\n")
(command "-insert" "CTrinh" PT1 TSIZE "" "0")
(SETVAR "CMDECHO" CMD)
(SETVAR "CLAYER" NBC)
(SETVAR "OSMODE" OSM)
(PRINC)
)
;---------------------
(defun taobl()
(entmake '((0 . "BLOCK")(2 . "CTrinh")(70 . 2)(10 0.0 0.0 0.0)))  
(entmake 
   	'((0 . "LINE")(62 . 150)(8 . "ghichu")
  (10 -1.0 0.0 0.0)(11 1.0 0.0 0.0)))
(entmake 
   	'((0 . "LINE")(62 . 7)(8 . "ghichu")
  (10 0.0 0.0 0.0)(11 1.0 0.5 0.0)))
(entmake 
   	'((0 . "LINE")(62 . 7)(8 . "ghichu")
  (10 1.0 0.5 0.0)(11 -1.0 0.5 0.0)))
(entmake 
   	'((0 . "LINE")(62 . 150)(8 . "ghichu")
  (10 0.0 0.0 0.0)(11 0.0 3.0 0.0)))
(entmake 
   	'((0 . "LINE")(62 . 150)(8 . "ghichu")
  (10 -1.0 1.0 0.0)(11 4.5 1.0 0.0)))
(entmake 
   	'((0 . "SOLID")(62 . 7)(8 . "ghichu")
  (10 0.0 0.0 0.0)(11 0.0 0.5 0.0)
  (12 -1.0 0.5 0.0)(13 0.0 0.5 0.0)
 	  (39 . 0.0)))
(entmake 
   	'((0 . "ATTDEF")(8 . "ghichu")
  (10 0.25 1.50 0.0)
  (1 . "0.00")
  (2 . "CT_ID")
   	  (3 . "Gia_tri_cao_trinh:")
  (40 . 1.0)(41 . 1.0)
  (50 . 0.0)(70 . 0)
  (71 . 0)(72 . 0)(62 . 84)
  (73 . 0)))
(entmake '((0 . "ENDBLK")))	  
)
;---------------------
(defun c:bn()
(command "osnap"  "")
(command "osnap" "End,Mid,Cen,Quad,Int,Perp,Tan,Near,App,Int,Ext,Par"  )
)

 

Có gì Post lại nhé!!!

Cảm ơn bạn rất nhiều nhưng trong lisp của bạn cho gán tên layer cho đường thằng và solid nhưng sao không cho gán tên layer cho TEXT 0.00 .Mong bạn giúp giù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
Cám ơn Bác Tuệ nhiều, bác bổ sung thêm đoạn đứng dài 50 hai bên như trong hình giùm, ở bất kỳ ID nào đều có đoạn này

Của bác đây :


(defun c:veh(/ ID R1 H L tam maxp maxp_H minX maxX Lmin Lmax
    g1 g2 e1 e2 e3 os)
 (setq os (getvar "osmode"))
 (setvar "osmode" 0)
 (setq ID (getdist "\n Nhap tri so ID :")
R1 (* ID 0.9045) R2 (* ID 0.1728)
H (/ ID 4) L (* ID 0.3272)
 )
 (setq tam (getpoint "\n Chon diem tam cua cung R1 :"))
 (setq maxp (list (car tam) (+ (cadr tam) R1) 0.0)
maxp_H (list (car tam) (- (+ (cadr tam) R1) H) 0.0)
minX (list (- (car tam) (/ ID 2)) (cadr maxp_H) 0.0)
maxX (list (+ (car tam) (/ ID 2)) (cadr maxp_H) 0.0)
Lmin (list (- (car tam) L) (cadr maxp_H) 0.0)
Lmax (list (+ (car tam) L) (cadr maxp_H) 0.0)
 )
 (command "circle" tam R1)(setq e1 (entlast))
 (command "circle" Lmin R2)(setq e2 (entlast))
 (command "circle" Lmax R2)(setq e3 (entlast))
 (setq g1 (car (ACET-GEOM-INTERSECTWITH e1 e2 0)))
 (setq g2 (car (ACET-GEOM-INTERSECTWITH e1 e3 0)))
 (command "arc" "c" tam g2 g1)
 (command "arc" "c" Lmin g1 minX)
 (command "arc" "c" Lmax maxX g2)
 (entdel e1) (entdel e2) (entdel e3)
 (command "line" tam maxp "")
 (command "line" Lmin g1 "")
 (command "line" Lmax g2 "")
 (command "line" minX (polar minX (- (/ pi 2)) 50) "")
 (command "line" maxX (polar maxX (- (/ pi 2)) 50) "")
 (command "line" (polar minX (- (/ pi 2)) 50) 
	  (polar maxX (- (/ pi 2)) 50) "")

 (setvar "osmode" os)
(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
Em xin phép đào lại bài 1 chút,vì những thắc mắc của e bị trôi đi nhanh quá^^

68191987.gif

bạn dung thử cái này

;; free lisp from cadviet.com
(defun  C:ban ()
(princ "\nChon 2 duong giao nhau: ")
(setq ss1 (ssget '((0 . "line,lwpolyline"))))
(princ "\nChon cac duong muon ban: ")
(setq ss2 (ssget '((0 . "line,lwpolyline"))))
(setq p1 (cdr (assoc 10 (entget (ssname ss1 0)))))
(setq p2 (cdr (assoc 11 (entget (ssname ss1 0)))))
(setq p3 (cdr (assoc 10 (entget (ssname ss1 1)))))
(setq p4 (cdr (assoc 11 (entget (ssname ss1 1)))))
(setq gd (inters p1 p2 p3 p4))
(setq i 0)
(while (< i (sslength ss2))
(setq entname (ssname ss2 i)
pb1 (cdr (assoc 10 (entget entname)))
pb2 (cdr (assoc 11 (entget entname)))
l1 (distance pb1 gd)
l2 (distance pb2 gd)
)
(if (< l1 l2)
(command "move" entname "" pb1 gd)
(command "move" entname "" pb2 gd)
)
(setq i (1+ 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ám ơn Bác Tuệ nhiều, bác bổ sung thêm đoạn đứng dài 50 hai bên như trong hình giùm, ở bất kỳ ID nào đều có đoạn này

Hề hề hề,

Biếu bác Tài xài chơi coi có ưng ý không hè???? Có gì chưa ưng bác lại hỏi nữa nghen.

(defun c:velp ( / oldcmd oldos H ID L R1 R2 G O1 O2 O3 p1 p2 )
(command "undo" "be")
(setq oldcmd (getvar "cmdecho")
       oldos (getvar "osmode" ))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq ID (getreal "\n Nhap gia tri duong kinh dinh bon: ")
       H (/ ID 4)
       L (* ID 0.3272)
       R1 (* ID 0.9045)
       R2 (* ID 0.1728)
       G (atan (- R1 H) L)
       O1 (getpoint "\n Chon diem tam cung R1")
       O2 (polar O1 G (- R1 R2))
       O3 (polar O1 (- pi G) (- R1 R2))
)
(command "arc" "c" O1 (polar O1 G R1) (polar O1 (- pi G) R1))
(command "arc" "c" O2 (setq p1 (polar O2 0 R2)) (polar O2 G R2))
(command "arc" "c" O3 (polar O3 (- pi G) R2) (setq p2 (polar O3 pi R2)))
(command "pline" p1 p2 (polar p2 (- (/ pi 2)) 50) (polar p1 (- (/ pi 2)) 50) p1 "")
(setvar "cmdecho" oldcmd)
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

 

PS: có cái ni bữa mô đi off Đè nẽng bác ôm đi mấy cái làm xuồng câu mực bác 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
Hề hề hề,

Đoạn lisp trên của bác nếu là để lấy tọa độ tâm của cái arc ở cuối đường pline thì có nhẽ đúng.......

Hề hề hề,.....

 

Đúng 50%, sai 50%

 

Hề hề Bác lại nói .... rồi.

biết toạ độ 2 điểm rồi thì lấy khoảng cách có khó gì....

 

Do đó, cái việc lấy khoảng cách -> Đúng 50%, sai 50%

Cái này bác nói ý thứ nhất thì đúng. Ý thứ 2 thì sai. vì chỉ cần lấy độ dài bán kính. Hì Hì

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 dung thử cái này

Cám ơn bạn nhìu.Lisp chạy tốt lắm.Nhưng ý đồ của mình là :

-Đầu vào user chỉ cần kick vào line cần bắn (ctrình tự tìm điểm giao nhau gần nhất của 2 đường khác)

- Line này giữ nguyên gốc

Lisp của bạn tương đương với việc mình dùng lệnh move rồi move cả line sang điểm giao đó (2 thao tác)

Ý của mình tương đương với việc kick vào line,rồi kéo đầu line vào điểm giao đó (2 thao tác)

Nếu dùng lisp thì 1 thao tác ^^

Cho mình hỏi luôn là có cách nào làm 3(hoặc nhiều hơn) đương thẳng trên tự động đồng quy tại điểm giao nhau của 2 đường thẳng biên 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
Cái này bác nói ý thứ nhất thì đúng. Ý thứ 2 thì sai. vì chỉ cần lấy độ dài bán kính. Hì Hì

Tue_NV sai chổ nào vậy bạn?

Bạn nên nhớ rằng khoảng cách từ tâm cong đến các điểm trên cung đều bằng nhau và bằng bán kính cong.

Nếu khoảng cách từ tâm cong các điểm trên cung không bằng nhau là sai rồi bạn à

Nếu tôi chọn 1 điểm bất kì trên đường cong đến tâm cung như với Lisp của bạn đã viết thì có đúng 100% hay 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
Cám ơn bạn nhìu.Lisp chạy tốt lắm.Nhưng ý đồ của mình là :

-Đầu vào user chỉ cần kick vào line cần bắn (ctrình tự tìm điểm giao nhau gần nhất của 2 đường khác)

cái này có thể làm được nhưng nó sẽ khá nặng nếu bản vẽ của bạn nhiều đối tượng.

- Line này giữ nguyên gốc

Lisp của bạn tương đương với việc mình dùng lệnh move rồi move cả line sang điểm giao đó (2 thao tác)

Ý của mình tương đương với việc kick vào line,rồi kéo đầu line vào điểm giao đó (2 thao tác)

Nếu dùng lisp thì 1 thao tác ^^

Cái này thì mình đã sửa lại cho bạn rồi nè:

(defun  C:ban2 ()
(princ "\nChon 2 duong giao nhau: ")
(setq ss1 (ssget '((0 . "line,lwpolyline"))))
(princ "\nChon cac duong muon ban: ")
(setq ss2 (ssget '((0 . "line,lwpolyline"))))
(setq p1 (cdr (assoc 10 (entget (ssname ss1 0)))))
(setq p2 (cdr (assoc 11 (entget (ssname ss1 0)))))
(setq p3 (cdr (assoc 10 (entget (ssname ss1 1)))))
(setq p4 (cdr (assoc 11 (entget (ssname ss1 1)))))
(setq gd (inters p1 p2 p3 p4))
(setq i 0)
(while (< i (sslength ss2))
(setq entname (ssname ss2 i)
pb1 (cdr (assoc 10 (entget entname)))
pb2 (cdr (assoc 11 (entget entname)))
l1 (distance pb1 gd)
l2 (distance pb2 gd)
)
(if (< l1 l2)
(progn
(setq thay (subst (cons 10 gd) (cons 10 pb1)  (entget entname)))
(entmod thay)
)
(progn
(setq thay (subst (cons 11 gd) (cons 11 pb2)  (entget entname)))
(entmod thay)
)
)
(setq i (1+ i))
)
)

Cho mình hỏi luôn là có cách nào làm 3(hoặc nhiều hơn) đương thẳng trên tự động đồng quy tại điểm giao nhau của 2 đường thẳng biên không?

với cả 2 lisp trên bạn thích bắn bao nhiêu đường vào điểm giao của 2 đường thẳng cũng được hết.

  • 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
Tue_NV sai chổ nào vậy bạn?

Bạn nên nhớ rằng khoảng cách từ tâm cong đến các điểm trên cung đều bằng nhau và bằng bán kính cong.

Nếu khoảng cách từ tâm cong các điểm trên cung không bằng nhau là sai rồi bạn à

Nếu tôi chọn 1 điểm bất kì trên đường cong đến tâm cung như với Lisp của bạn đã viết thì có đúng 100% hay không?

Hề hề

Với lisp trên của mình nói là đúng 50% vì toạ độ của tâm mình không khống chế được lúc thì nó nhảy ra ngoài lúc thì nó nhảy vào trong như hình. Tiện thể bạn giải thích giùm mình luôn.

Nếu như bạn nói muốn chọn điểm bất kì trên cung đó thì phải lấy khoảng cách đểm đó tới tâm chứ ai lại lấy điểm đầu hay điểm cuối để tính bán kính. Cám ơn bạn đã gớp ý cho mình!! thank!!!

untitled1.jpg

  • 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ái này có thể làm được nhưng nó sẽ khá nặng nếu bản vẽ của bạn nhiều đối tượng.

 

Cái này thì mình đã sửa lại cho bạn rồi nè:

(defun  C:ban2 ()
(princ "\nChon 2 duong giao nhau: ")
(setq ss1 (ssget '((0 . "line,lwpolyline"))))
(princ "\nChon cac duong muon ban: ")
(setq ss2 (ssget '((0 . "line,lwpolyline"))))
(setq p1 (cdr (assoc 10 (entget (ssname ss1 0)))))
(setq p2 (cdr (assoc 11 (entget (ssname ss1 0)))))
(setq p3 (cdr (assoc 10 (entget (ssname ss1 1)))))
(setq p4 (cdr (assoc 11 (entget (ssname ss1 1)))))
(setq gd (inters p1 p2 p3 p4))
(setq i 0)
(while ((setq entname (ssname ss2 i)
pb1 (cdr (assoc 10 (entget entname)))
pb2 (cdr (assoc 11 (entget entname)))
l1 (distance pb1 gd)
l2 (distance pb2 gd)
)
(if ((progn
(setq thay (subst (cons 10 gd) (cons 10 pb1)  (entget entname)))
(entmod thay)
)
(progn
(setq thay (subst (cons 11 gd) (cons 11 pb2)  (entget entname)))
(entmod thay)
)
)
(setq i (1+ i))
)
)

 

với cả 2 lisp trên bạn thích bắn bao nhiêu đường vào điểm giao của 2 đường thẳng cũng được hết.

Hì.Không ngờ bạn sửa lại nhanh thế ^^ Tks bạn nhiều,đã ngon nghẻ rồi.bạn giúp mình làm fill luôn cả 2 đường bao bên ngoài vào trong cùng thao tác đó được không ? (Tức là 2 đường biên giao nhau bên ngoài bị thừa ra 1 tí,mình không cần phải f nó nữa ý :"> )

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
Hề hề

Với lisp trên của mình nói là đúng 50% vì toạ độ của tâm mình không khống chế được lúc thì nó nhảy ra ngoài lúc thì nó nhảy vào trong như hình. Tiện thể bạn giải thích giùm mình luôn.

Nếu như bạn nói muốn chọn điểm bất kì trên cung đó thì phải lấy khoảng cách đểm đó tới tâm chứ ai lại lấy điểm đầu hay điểm cuối để tính bán kính. Cám ơn bạn đã gớp ý cho mình!! thank!!!

untitled1.jpg

Hề hề hề,

Chào bác Phamngoctukts,

Hình như bác quên rằng hàm (vlax-curve-getsecondderive ....) là trả về véc tơ pháp tuyến bác ạ. Đã là vecto thì ắt là nó có chiều xác định của nó rồi. Vậy bác còn băn khoăn làm chi cái vụ chiều của nó nữa nhể. Bác cứ hiểu rằng vec tơ pháp tuyến luôn hướng từ cung tròn về tâm là được bác ạ . Hay là mình nhầm nhể????

Hề hề hề....

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
Hề hề hề,

Chào bác Phamngoctukts,

Hình như bác quên rằng hàm (vlax-curve-getsecondderive ....) là trả về véc tơ pháp tuyến bác ạ. Đã là vecto thì ắt là nó có chiều xác định của nó rồi. Vậy bác còn băn khoăn làm chi cái vụ chiều của nó nữa nhể. Bác cứ hiểu rằng vec tơ pháp tuyến luôn hướng từ cung tròn về tâm là được bác ạ . Hay là mình nhầm nhể????

Hề hề hề....

Không phải thế đâu bác Bình ạ. Cùng lisp trên nếu vẽ cung ngửa lên trên hoặc úp xuống là tâm nó bị lộn ngược ngay. Nên em cũng không hiểu chỗ nà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
Hì.Không ngờ bạn sửa lại nhanh thế ^^ Tks bạn nhiều,đã ngon nghẻ rồi.bạn giúp mình làm fill luôn cả 2 đường bao bên ngoài vào trong cùng thao tác đó được không ? (Tức là 2 đường biên giao nhau bên ngoài bị thừa ra 1 tí,mình không cần phải f nó nữa ý :"> )

Của bạn đây. Vừa ý rồi nhé. Chúc bạn vui.

(defun  C:ban2 ()
(princ "\nChon 2 duong giao nhau: ")
(setq ss1 (ssget '((0 . "line,lwpolyline"))))
(setq d1 (ssname ss1 0))
(setq d2 (ssname ss1 1))
(command "fillet" d1 d2)
(princ "\nChon cac duong muon ban: ")
(setq ss2 (ssget '((0 . "line,lwpolyline"))))
(setq p1 (cdr (assoc 10 (entget (ssname ss1 0)))))
(setq p2 (cdr (assoc 11 (entget (ssname ss1 0)))))
(setq p3 (cdr (assoc 10 (entget (ssname ss1 1)))))
(setq p4 (cdr (assoc 11 (entget (ssname ss1 1)))))
(setq gd (inters p1 p2 p3 p4))
(setq i 0)
(while (< i (sslength ss2))
(setq entname (ssname ss2 i)
pb1 (cdr (assoc 10 (entget entname)))
pb2 (cdr (assoc 11 (entget entname)))
l1 (distance pb1 gd)
l2 (distance pb2 gd)
)
(if (< l1 l2)
(progn
(setq thay (subst (cons 10 gd) (cons 10 pb1)  (entget entname)))
(entmod thay)
)
(progn
(setq thay (subst (cons 11 gd) (cons 11 pb2)  (entget entname)))
(entmod thay)
)
)
(setq i (1+ i))
)
)

  • 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

Chào bác Tue_VN

Em vừa nghĩ ra cách này để lấy toạ độ tâm của đường Pline cong mà không phải dùng code ActiveX. tuy nó Ấu trĩ nhưng em ngĩ là có thể áp dụng được.

(defun c:tam()
(setq old_echo (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "undo" "m")
(setq ss (ssget '((0 . "lwpolyline"))))
(command "explode" ss)
(setq ss1 (ssget "p" '((0 . "arc"))))
(setq i 0)
(setq ltam nil)
(while (< i (sslength ss1))
(setq tam (cdr (assoc 10 (entget (ssname ss1 i)))))
(setq ltam (append ltam (list tam)))
(setq i (1+ i))
)
(command "undo" "b")
(setvar "cmdecho" old_echo)
(princ (car ltam))
)

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. Vừa ý rồi nhé. Chúc bạn vui.

Hi bạn.Mình vừa đi xa về.Cám ơn bạn rất nhiều.Nhân tiện cho mình thắc mắc 1 chút.Mình tưởng lệnh fillet thực hiện trước vòng lặp thì ngay cả khi 2 đường biên không giao nhau nó cũng tự fillet rồi mới bắt đầu việc chuyển đầu line vào điểm giao.Nhưng mình test thấy không được.Bạn chỉ giúp mình với nhé :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
Hi bạn.Mình vừa đi xa về.Cám ơn bạn rất nhiều.Nhân tiện cho mình thắc mắc 1 chút.Mình tưởng lệnh fillet thực hiện trước vòng lặp thì ngay cả khi 2 đường biên không giao nhau nó cũng tự fillet rồi mới bắt đầu việc chuyển đầu line vào điểm giao.Nhưng mình test thấy không được.Bạn chỉ giúp mình với nhé :undecided:

Của ban đây. Mình đã sửa lại rồi.

(defun  C:ban2 ()
(command "undo" "be")
(princ "\nChon 2 duong giao nhau: ")
(setq ss1 (ssget '((0 . "line,lwpolyline"))))
(princ "\nChon cac duong muon ban: ")
(setq ss2 (ssget '((0 . "line,lwpolyline"))))
(setq d1 (ssname ss1 0))
(setq d2 (ssname ss1 1))
(command "fillet" "r" "0" "")
(command "fillet" d1 d2)
(setq p1 (cdr (assoc 10 (entget d1))))
(setq p2 (cdr (assoc 11 (entget d1))))
(setq p3 (cdr (assoc 10 (entget d2))))
(setq p4 (cdr (assoc 11 (entget d2))))
(setq gd (inters p1 p2 p3 p4))
(setq i 0)
(while (< i (sslength ss2))
(setq entname (ssname ss2 i)
pb1 (cdr (assoc 10 (entget entname)))
pb2 (cdr (assoc 11 (entget entname)))
l1 (distance pb1 gd)
l2 (distance pb2 gd)
)
(if (< l1 l2)
(progn
(setq thay (subst (cons 10 gd) (cons 10 pb1)  (entget entname)))
(entmod thay)
)
(progn
(setq thay (subst (cons 11 gd) (cons 11 pb2)  (entget entname)))
(entmod thay)
)
)
(setq i (1+ i))
)
(command "undo" "e")
)

  • 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

Tks bạn..Tuyệt vời rồi ^^.Đêm qua mình mệt quá ngủ quên mất,không ngờ bạn fĩx nhanh và nhiệt tình thế :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 các anh em ở đây giúp đỡ khá nhiều rồi,từ hnay sẽ bắt đầu nghiên cứu để hiểu hơn về nó..Biết đâu sau này lại giúp lại được những anh em khác^^.Nhưng học qua ví dụ ứng dụng thực tiễn thì vẫn nhanh hơn,nên sẽ chăm chỉ nhờ vả và hỏi hơn..

Đầu tiên,mình muốn vẽ định vị cột như hình vẽ sau bằng lisp,với một quy cách định trước

69423628.gif

Đầu vào :

- Command :dvc

- Nhập tỉ lệ định vẽ.(Tỉ lệ mặc định là 1/20)

- Cạnh a :(user nhập chiều dài thực tế,mặc định là 220) - Ví dụ 300

- Ký hiệu Trục cạnh a(mặc định là -)

- Cạnh b :(user nhập chiều dài thực tế)

- Ký hiệu Trục cạnh b,(mặc định là -)

 

Sau bước này thì hình chữ nhật định vị cột sẽ hiện ra ở con trỏ chuột và chờ người dùng pick điểm đặt.Điểm đặt là tâm cột (trực quan)

 

Yêu cầu cần thực hiện :

- Vẽ cột với layer COT,bằng pline hoặc line,nếu layer này chưa có thì tạo layer với tên COT,màu 30,chiều dày nét 0.3mm- Hatch cột vừa tạo bằng pat betong,tỉ lệ hatch 10,góc hatch 0

- Vẽ 2 đường gióng trục cột bằng layer TRUC,cụ thể trục đi qua trung điểm 2 cạnh cột,nếu chưa có thì tạo layer TRUC,màu 251,dày 0.5

Trục thò ra bên ngoài cột 2mm ( chiều dài thực )

- Dim chi tiết từ trục ra cạnh cột,dim tổng thể.Chân dim cách cạnh cột 4mm(chiều dài thực),chân dim dài 5mm(cdài thực).

- Kiểu dim là Dx (với x là tỉ lệ nhập vào từ đầu),layer DIM (nếu chưa có layer và dimstyle này thì tạo ra)

- Ghi chú ký hiệu 2 trục với style chữ GHICHU,layer Text,nếu chưa có thì tạo ra

- Ky hiệu trục nằm trong vòng tròn bán kính 5.75mm (thực).Hình tròn này vẽ bằng layer MANH,màu abc,dày abc..nếu chưa có thì tạo ra

- Vòng tròn ký hiệu nằm cách dim tổng 1 đoạn 2mm,được nối với dim tổng bằng 1 đoạn thẳng với layer THAY,,màu abc,dày abc..nếu chưa có thì tạo ra

 

- Mục đích học hỏi :

+ Làm sao để vẽ 1 hình chữ nhật,sau đó để tâm HCN vào đầu con trỏ

+ Sau khi tạo ra hcn đó,làm sao để thao tác hatch trực tiếp với đối tượng vừa tạo ra,nhất là nếu vẽ bằng line hứ k phải pline

+ Làm sao để dim 2 đầu mút cạnh hcn,giả sử nó được vẽ bằng pl chứ không phải line ?và với khoảng cách định trước của dim so với đường thẳng,chiều dài chân dim?

+ Làm thế nào để xác định trung điểm đoạn dim ( để ghi ký hiệu)

+ Phần chữ màu nhạt tức là mình có thể giải quyết bằng cách thiết lập ngay từ khi tạo bản vẽ,hoặc tạo 1 file template.

Còn nếu khởi tạo bằng lisp,thì với các hàm con tạo layer theo màu,chều dày nét thì mình đã biết,nhưng với tạo dimstyle thì chưa biết,vì có quá nhiều thiết đặt ở đấy,và mình không biết tìm các biến thiết đặt này ở đâu :undecided:

 

Tranh thủ CN nên yêu cầu có vẻ dài dòng,rườm rà,mong mọi người giúp mình..:">

File Cad

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 là thành viên mới, vì công việc nên đang xử lý dữ lieu địa hình thô trên autocad. Là người ngoại đạo nên mình không biết về lisp. Sau khi mày mò nhiều đã tìm được 1 lisp phù hợp công việc hiện tại, nhưng khổ nỗi lisp này lại bắt chọn từng điểm. Dữ liệu của mình chứa hàng chục ngàn điểm, nếu chọn từng cái chắc chết mất. Mình up lisp này lên nhờ các bạn xem và có thể modify lại để có thể chọn tất cả các điểm 1 lần hay không.

link: http://www.mediafire.com/?igcli980j9fzi1m

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 là thành viên mới, vì công việc nên đang xử lý dữ lieu địa hình thô trên autocad. Là người ngoại đạo nên mình không biết về lisp. Sau khi mày mò nhiều đã tìm được 1 lisp phù hợp công việc hiện tại, nhưng khổ nỗi lisp này lại bắt chọn từng điểm. Dữ liệu của mình chứa hàng chục ngàn điểm, nếu chọn từng cái chắc chết mất. Mình up lisp này lên nhờ các bạn xem và có thể modify lại để có thể chọn tất cả các điểm 1 lần hay không.

link: http://www.mediafire.com/?igcli980j9fzi1m

Mong các bạn giúp đỡ.

Ông này vừa lập hẳn 1 topic để hỏi về vấn đề này. Giờ laọi hỏi tiếp ở đâ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
Mình là thành viên mới, vì công việc nên đang xử lý dữ lieu địa hình thô trên autocad. Là người ngoại đạo nên mình không biết về lisp. Sau khi mày mò nhiều đã tìm được 1 lisp phù hợp công việc hiện tại, nhưng khổ nỗi lisp này lại bắt chọn từng điểm. Dữ liệu của mình chứa hàng chục ngàn điểm, nếu chọn từng cái chắc chết mất. Mình up lisp này lên nhờ các bạn xem và có thể modify lại để có thể chọn tất cả các điểm 1 lần hay không.

link: http://www.mediafire.com/?igcli980j9fzi1m

Mong các bạn giúp đỡ.

Chào bạn shockyboy87,

Bạn là thành viên mới, rất mong bạn tôn trọng nội quy diễn đàn, lần sau nếu bạn tiếp tục post cùng một vấn đề trên nhiều topic khác nhau, bạn sẽ bị xóa bài post đó.

Chúc bạn vui khi tham gia diễn đà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ảm ơn bạn rất nhiều nhưng trong lisp của bạn cho gán tên layer cho đường thằng và solid nhưng sao không cho gán tên layer cho TEXT 0.00 .Mong bạn giúp giùm.

Bạn muốn gán Layer gì cho nó, do trong lisp kia là layer "ghichu" mà, nếu muốn bạn có thể dùng lệnh BATTMAN của cad để chỉnh, nếu có định một layer thì viết cụ thể nhé, nếu làm được mình sẽ giúp. (@PS: cuối tuần về nhà không có mạng nên không xem bài của bạn được. SR)

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 trước,mấy đổi mấy layer kia thì mình làm được nhưng layer cho 0.00 thì không làm được,thí dụ mình muốn gán cho nó là layer TEXT chẳng hạ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 đã được các anh em ở đây giúp đỡ khá nhiều rồi,từ hnay sẽ bắt đầu nghiên cứu để hiểu hơn về nó..Biết đâu sau này lại giúp lại được những anh em khác^^.Nhưng học qua ví dụ ứng dụng thực tiễn thì vẫn nhanh hơn,nên sẽ chăm chỉ nhờ vả và hỏi hơn..

Đầu tiên,mình muốn vẽ định vị cột như hình vẽ sau bằng lisp,với một quy cách định trước

69423628.gif

Đầu vào :

- Command :dvc

- Nhập tỉ lệ định vẽ.(Tỉ lệ mặc định là 1/20)

- Cạnh a :(user nhập chiều dài thực tế,mặc định là 220) - Ví dụ 300

- Ký hiệu Trục cạnh a(mặc định là -)

- Cạnh b :(user nhập chiều dài thực tế)

- Ký hiệu Trục cạnh b,(mặc định là -)

 

Sau bước này thì hình chữ nhật định vị cột sẽ hiện ra ở con trỏ chuột và chờ người dùng pick điểm đặt.Điểm đặt là tâm cột (trực quan)

 

Yêu cầu cần thực hiện :

- Vẽ cột với layer COT,bằng pline hoặc line,nếu layer này chưa có thì tạo layer với tên COT,màu 30,chiều dày nét 0.3mm- Hatch cột vừa tạo bằng pat betong,tỉ lệ hatch 10,góc hatch 0

- Vẽ 2 đường gióng trục cột bằng layer TRUC,cụ thể trục đi qua trung điểm 2 cạnh cột,nếu chưa có thì tạo layer TRUC,màu 251,dày 0.5

Trục thò ra bên ngoài cột 2mm ( chiều dài thực )

- Dim chi tiết từ trục ra cạnh cột,dim tổng thể.Chân dim cách cạnh cột 4mm(chiều dài thực),chân dim dài 5mm(cdài thực).

- Kiểu dim là Dx (với x là tỉ lệ nhập vào từ đầu),layer DIM (nếu chưa có layer và dimstyle này thì tạo ra)

- Ghi chú ký hiệu 2 trục với style chữ GHICHU,layer Text,nếu chưa có thì tạo ra

- Ky hiệu trục nằm trong vòng tròn bán kính 5.75mm (thực).Hình tròn này vẽ bằng layer MANH,màu abc,dày abc..nếu chưa có thì tạo ra

- Vòng tròn ký hiệu nằm cách dim tổng 1 đoạn 2mm,được nối với dim tổng bằng 1 đoạn thẳng với layer THAY,,màu abc,dày abc..nếu chưa có thì tạo ra

 

- Mục đích học hỏi :

+ Làm sao để vẽ 1 hình chữ nhật,sau đó để tâm HCN vào đầu con trỏ

+ Sau khi tạo ra hcn đó,làm sao để thao tác hatch trực tiếp với đối tượng vừa tạo ra,nhất là nếu vẽ bằng line hứ k phải pline

+ Làm sao để dim 2 đầu mút cạnh hcn,giả sử nó được vẽ bằng pl chứ không phải line ?và với khoảng cách định trước của dim so với đường thẳng,chiều dài chân dim?

+ Làm thế nào để xác định trung điểm đoạn dim ( để ghi ký hiệu)

+ Phần chữ màu nhạt tức là mình có thể giải quyết bằng cách thiết lập ngay từ khi tạo bản vẽ,hoặc tạo 1 file template.

Còn nếu khởi tạo bằng lisp,thì với các hàm con tạo layer theo màu,chều dày nét thì mình đã biết,nhưng với tạo dimstyle thì chưa biết,vì có quá nhiều thiết đặt ở đấy,và mình không biết tìm các biến thiết đặt này ở đâu :(

 

Tranh thủ CN nên yêu cầu có vẻ dài dòng,rườm rà,mong mọi người giúp mình..:">

File Cad

Chào bạn ketxu,

Yêu cầu của bạn không khó. Tuy nhiên do bạn muốn "từ hnay sẽ bắt đầu nghiên cứu để hiểu hơn về nó..Biết đâu sau này lại giúp lại được những anh em khác^^", nên không ai có thể gạt bỏ cái ước muốn ấy của bạn.

Vậy bạn hãy bắt tay vào làm đi nhé. Bắt đầu từ bước đầu tiên là tạo cho được cái hình chữ nhật có định vị ở tâm. Mình chưa hiểu hết ý định của bạn song có nhẽ chả cần cái định vị ở tâm này. Vấn đề bạn cần là copy hay move cái hình chữ nhật này sao cho cái tâm của nó về trúng cái vị trí mà bạn pick. Do đó theo ngu ý của mình thì khi copy hay move bạn chỉ cần lấy điểm gốc của cái sự copy hay move ấy chính là cái tâm hình chữ nhật là OK bạn ạ. Như vậy thì hình như nó sẽ đơng giản hơn cái vụ phải có cái tâm của hình chữ nhật bạn ạ.

Hề hề hề. vài lời góp ý mong bạn chóng thành cô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
Cảm ơn bạn trước,mấy đổi mấy layer kia thì mình làm được nhưng layer cho 0.00 thì không làm được,thí dụ mình muốn gán cho nó là layer TEXT chẳng hạn.

Chào bạn 790312,

Bạn hãy xem kỹ cái lisp của bác dkk3a đi. Cái text 0.00 của bác ấy là một attdef cơ mà. Nếu bạn muốn thay đổi lớp của nó thì phải thay đổi trong hàm tạo attdef chứ làm sao thay đổi nó trực tiếp trên bản vẽ được?????

Bạn hãy tìm hiểu kỹ hơn về các attdef sẽ hiểu, còn lisp của bác dkk3a đã làm đúng ý bạn 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×