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

Xem giúp đoạn lisp của mình vẽ pline có nhập chiều dài và góc

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

Èo không biết các bạn dùng lệnh insert thế nào chứ bản vẽ mà không có block đấy thì coi như toi. Bạn nên thêm phần tạo block khi không có block đó trong bản vẽ.

 

Bác cho em hỏi nếu mình đã tạo sẵn các block trên 1 bản vẽ mẫu sẵn và lưu lại. Sau này người dùng chỉ cần mở bản vẽ đó và insert đúng tên block thì vẫn đc chứ bác nhỉ? THANK BÁ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
Cái này dễ

Bạn cứ copy lệnh

(command "insert")

Vào câu lệnh của AUtoCad thì nó sẽ hiện ra như sau :

1. Enter block name or [?]:

2. Specify insertion point or [scale/X/Y/Z/Rotate/PScale/PX/PY/PZ/PRotate]:

3. Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>: 1

4. Enter Y scale factor : 1

5. Specify rotation angle <0>:

thì ứng với 5 câu lệnh đó thì bạn sẽ cho 5 biến vào chương trình lisp như thế này nè

(command "insert" 1 2 3 4 5)

cái nào bạn không nhập biến như cái 3, 4 nhập không nhập biến thì xài dấu "" như sau :

(command "insert" 1 2 "" "" 5)

 

ÔI! Cảm ơn bác nhìu lắm bác ui!! Chưa khi nào mình được SUPPORT nhìu như diễn đàn CADVIET đóa!!

 

Chúc mọi người trong diễn đàn lun mạnh khỏe và ngày càng chia sẻ nhìu kiến thức cho nhau hơn! Chúc diễn đàn mãi mãi vững mạnh!! :D

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 hungdlcm ơi

Bác có bản vẽ chuẩn trắc dọc+mặt bằng thiết kế điện không

Post lên cho mình 1 bản nghiên cứu với

 

Mình chỉ có bản vẽ mặt bằng điện thui! Nhưng mình không dám up file lên đây vì Công ty mình có nguyên tắc không đc phép cho file thiết kế và dự toán ra ngoài nghành. Mong bác hỉu và thông cảm cho em. Bác júp em mà em không júp lại đc ngại wá. Hic...

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 cho em hỏi nếu mình đã tạo sẵn các block trên 1 bản vẽ mẫu sẵn và lưu lại. Sau này người dùng chỉ cần mở bản vẽ đó và insert đúng tên block thì vẫn đc chứ bác nhỉ? THANK BÁC!!

Ừ bạn có tên block đấy trong bản vẽ là được. Nhưng để thuận tiện thì bạn nên tạo một block bằng lệnh. Đối với người mới học lsp như bạn mình hướng dẫn bạn 1 cách đơn giản để tạo 1 block.

Đầu tiên bạn vẽ 1 block và ghi lại tất cả các công đoạn để vẽ ra nó, cuối cùng bạn dùng lệnh block để gom chúng lại và đặt tên thôi. Mình chỉ gợi ý như vậy vì bạn muốn tự thực hiện thì cũng tốt. Cố gắng lên mình mới viết lsp khoảng 6tháng giờ kiến thức cũng tàm tạm rồi. Chúc bạn 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
Bác cho em hỏi nếu mình đã tạo sẵn các block trên 1 bản vẽ mẫu sẵn và lưu lại. Sau này người dùng chỉ cần mở bản vẽ đó và insert đúng tên block thì vẫn đc chứ bác nhỉ? THANK BÁC!!

Khi viết lisp cần dùng block tốt nhất là tạo 1 thư mục chứa tất cả các block này (trường hợp của mình C:\\tienich\\dwg)và có hai cách ứng xử với các file này:

+Chỉ đích danh file với đầy đủ đường dẩn ví dụ:

(command ".INSERT" "C:\\tienich\\dwg\\cott.dwg" diemchen 1 1 0)

+Chỉ tên file không có đường dẩn và tạo Support File Search Path đến thư mục chứa file ví dụ:

(command ".INSERT" "cott.dwg" diemchen 1 1 0)

Và Add thư mục C:\\tienich\\dwg\\ vào Support File Search Path.

  • 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
Khi viết lisp cần dùng block tốt nhất là tạo 1 thư mục chứa tất cả các block này (trường hợp của mình C:\\tienich\\dwg)và có hai cách ứng xử với các file này:

+Chỉ đích danh file với đầy đủ đường dẩn ví dụ:

(command ".INSERT" "C:\\tienich\\dwg\\cott.dwg" diemchen 1 1 0)

+Chỉ tên file không có đường dẩn và tạo Support File Search Path đến thư mục chứa file ví dụ:

(command ".INSERT" "cott.dwg" diemchen 1 1 0)

Và Add thư mục C:\\tienich\\dwg\\ vào Support File Search Path.

 

Nhưng... nếu zạ thì khi anh copy đoạn lisp này sang các máy khác thì hình như là không ổn khi chỉ đích danh đường dẫn.

 

Trang blog này chắc của anh hả anh Duy: http://duy782006.blogspot.com/

 

Em lang thang tìm tài liệu hướng dẫn tạo hộp thoại trong LISP lại vô tình lạc vào blog của anh có 1 bài hướng dẫn viết DCL và em đang đọc đây. :D

 

Anh Duy có ebook nào hướng dẫn tạo hộp thoại không anh share cho em qua Email nhá: hung0808@gmail.com

 

AH! Em phát hiện 1 điểm nữa là 2AE mình có cùng ngày và tháng sinh đó anh!! Hihi

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ưng... nếu zạ thì khi anh copy đoạn lisp này sang các máy khác thì hình như là không ổn khi chỉ đích danh đường dẫn.

 

Trang blog này chắc của anh hả anh Duy: http://duy782006.blogspot.com/

 

Em lang thang tìm tài liệu hướng dẫn tạo hộp thoại trong LISP lại vô tình lạc vào blog của anh có 1 bài hướng dẫn viết DCL và em đang đọc đây. :D

 

Anh Duy có ebook nào hướng dẫn tạo hộp thoại không anh share cho em qua Email nhá: hung0808@gmail.com

 

AH! Em phát hiện 1 điểm nữa là 2AE mình có cùng ngày và tháng sinh đó anh!! Hihi

Do là hướng dẩn cho bạn từng bước chứ muốn lisp di động thì cũng có cách. Tham khảo tại block của mình hoặc tìm trên cadviet với từ khóa lisp di độ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

anh Hungdcl ơi, muốn gán giá trị mặc định cho L=2 và giá trị G bằng 45 độ thì làm thế nào trong đoạn lisp của anh thế. làm thế nào để khi mình đánh lệnh dcl và pick 1 điểm thì ra luôn được pline có giá trị bằng 2 và góc 45 độ.

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ưởng của mình là viết 1 đoạn lisp để cad vẽ 1 đường PLINE, yêu cầu người dùng nhập vào: điểm đầu của đường thẳng, chiều dài đường thẳng và góc mà đường thẳng đó hợp với phương mặt phẳng ngang.

 

Ví dụ: đoạn thẳng cần vẽ có chiều dài là 100 và hướng theo 1 góc xéo 45 độ. Bình thường nếu vẽ trong cad phải thao tác như sau:

- gõ lệnh pline

- click chọn điểm đầu tiên (first point)

- sau đó ở dòng lệnh second point nhập vào: @100<45

 

Và dưới đây là đoạn lisp mà mình viết nhưng không cho ra kết quả như mong muốn mà cho kết quả là "UNKNOW DPL..." (lệnh mà mình viết là DPL):

 

(defun c:dpl()
(setq P1 (getpoint "cho diem dau: "))
(setq L (getint "nhap chieu dai: "))
(setq G (getint "nhap so goc: "))
(setq P2 (list @ L < G))
(command "pline" P1 P2 "")
(princ)
)

 

Mình biết chắc là đoạn lisp trên có sai nhưng mình không biết sửa như thế nào! Mình chỉ mới tìm hiểu lisp trên diễn đàn CADVIET thui nên chưa rành lắm. Mong các bác có kinh nghiệm chỉ bảo giủp. Nếu được thì bác nào hướng dẫn cho cách viết đoạn lisp để thực hiện ý tưởng trên.

 

CẢM ƠN CÁC BÁC RẤT RẤT NHIỀU!

Ý tưởng của mình là viết 1 đoạn lisp để cad vẽ 1 đường PLINE, yêu cầu người dùng nhập vào: điểm đầu của đường thẳng, chiều dài đường thẳng và góc mà đường thẳng đó hợp với phương mặt phẳng ngang.

 

Ví dụ: đoạn thẳng cần vẽ có chiều dài là 100 và hướng theo 1 góc xéo 45 độ. Bình thường nếu vẽ trong cad phải thao tác như sau:

- gõ lệnh pline

- click chọn điểm đầu tiên (first point)

- sau đó ở dòng lệnh second point nhập vào: @100<45

 

Nếu chỉ đơn giản như thế anh nên vẽ kiểu bắt điểm theo chế độ Polar Tracking nhanh hơ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

Các bác ui! Sau 2 ngày mày mò và nhờ sự chỉ bảo của các bác em đã làm được như dưới đây nhưng bây jờ còn 1 lỗi gì mà em mò hoài không ra mong các bác xem và chỉnh júp em.

 

Đầu tiên đây là 3 file của em gồm có file VLD.DCL, VLD.mns và VLD.pls:

 

1/ FILE VLD.DCL:

 

//VE
ve:dialog 
{label = "Chuong Trinh Tu Dong Ve Luoi Dien";
: edit_box {label = "Nhap khoang cach"; key = "dai"; edit_width = 15;}
: edit_box {label = "Nhap huong goc"; key = "goc"; edit_width = 15;}
:boxed_radio_column
{label = "Chon loai tru";
	  : radio_button {label = "&Tru 12m"; key = "t12";}
	: radio_button {label = "T&ru 10.5m"; key = "t10";}
}
:boxed_radio_column
{label = "Chon diem chen";
	  : radio_button {label = "Diem 1"; key = "diem1"; value = "1";}
	  : radio_button {label = "Diem 2"; key = "diem2";}
  }
  spacer;
ok_cancel;
}
//ABOUT VLD
about_VLD: dialog
{label = "Gioi thieu";
 :text {alignment = centered; label = "CHUONG TRINH TU DONG VE LUOI DIEN VLD 1.0";}
  spacer;
 ok_only;
}

2/ FILE VLD.mns:

 

***MENUGROUP=VELD_MN
***POP2
ID_VeLD [Ve &Luoi Dien]
ID_BeginVLD [&Bat Dau Ve]^C^C_VLD
ID_AboutVLD [&Gioi Thieu VLD 1.0]^C^C_aboutVLD
[--]
ID_Rem [&Go bo menu nay]^C^C_remVLD

 

3/ FILE VLD.pls:

 

;;;=====LOAD MENU =======================
(if (not (menugroup "VELD_MN")) (command "menuload" "VLD\\VLD.mns"))
(menucmd "P10=+VELD_MN.pop2")

;;;======REMOVE MENU====================
(defun C:remVLD() (command "menuunload" "VELD_MN"))

;;;=====GIOI THIEU==================
(defun C:aboutVLD(/ i )
  (setq i (load_dialog "VLD\\VLD.DCL"))
  (if (not (new_dialog "about_VLD" i)) (exit)) 
  (action_tile "accept" "(done_dialog)")
  (start_dialog)
  (unload_dialog i)
)
;;;==============DIALOG===================
(defun Dialog_Ve(/ i)
(setq i (load_dialog "VLD\\VLD.DCL"))
  (if (not (new_dialog "ve" i)) (exit))
(set_tile "dai" "100")
(set_tile "goc" "45")
(action_tile "cancel" "(done_dialog)(exit)")
(action_tile "accept" "(LaySoLieu)(done_dialog)")
(start_dialog)
(unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu()
(setq
L (atof (get_tile "dai"))
G (angtof (get_tile "goc"))
)
(if (= (get_tile "t12") "1") (setq E "Tru12") (setq E "Tru10"))
  (if (= (get_tile "diem1") "1") (setq A P1) (setq A P2))
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
(setq P1 (getpoint "Click chon 1 diem dau tien: "))
(setq PX (car P1) PY (cadr P1))
(setq TPX (* (cos G) L))
(setq TPY (* (sin G) L))
(setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
(setq OLDOS (getvar "OSMODE"))
(setvar "OSMODE" 0)
(command "pline" P1 P2 "")
(command "insert" E A 1 1 "")
(while (/= L nil)
	(setq PX (car P2) PY (cadr P2))
	(setq P1 (list PX PY 0.0))
	(Dialog_Ve)
	(setq TPX (* (cos G) L))
	(setq TPY (* (sin G) L))
	(setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
	(command "pline" P1 P2 "")
			(command "insert" E A 1 1 "")
)
(setvar "OSMODE" OLDOS)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/ L G E)
(Dialog_Ve)
(Ve L G E)
)
(princ)

Và đây là giao diện hộp thoại để người dùng nhập số liệu của em:

 

dialog.png

 

Mô tả cách thức hoạt động của chương trình:

 

- Khi load file VLD.pls sẽ load ra Menu Ve Luoi Dien trong ACAD.

 

- Chọn Menu Ve Luoi Dien -> chọn Bat Dau Ve

 

- Hiển thị hộp thoại. Người dùng nhập vào Khoảng Cách, nhập Hướng Góc, click vào 1 trong 2 radio button để chọn 1 loại trụ (mỗi loại trụ em đã tạo 1 block sẵn, ứng với Trụ 12m sẽ là block "Tru12" và ứng với Trụ 10m sẽ là block "Tru10").

 

- Click vào 1 trong 2 radio button để chọn 1 điểm chèn (Chọn "Diem 1" thì sẽ chèn block trụ điện mà người dùng đã click chọn ở bước trên vào điểm thứ nhất (P1) của đường PLine; Chọn "Diem 2" thì sẽ chèn vào điểm thứ 2 (P2) của đường Pline)

 

- Click OK -> người dùng click chọn điểm đầu -> vẽ đường Pline và chèn block trụ điện vào điểm mà người dùng đã chọn ở bước trên.

 

- Lặp lại quá trình từ mở hộp thoại nhập cho đến khi nào người dùng click Cancel.

 

Vấn đề vấp phải là:

 

- Các bước thực hiện đều OK ngoại trừ việc chèn block trụ điện vào đường Pline.

 

- Khi vẽ đường Pline đầu tiên thì CAD vẫn vẽ đúng đường Pline, vẫn có chèn block trụ điện nhưng chèn không đúng vị trí, block trụ điện được chèn ở 1 vị trí ngoài đường Pline (???).

 

- Khi hộp thoại được lặp lại để vẽ lần thứ 2 và các lần tiếp theo thì block trụ được chèn vào đúng điểm đầu của các đường Pline nhưng tùy chọn chèn block trụ điện vào "Diem 2" hoàn toàn không có tác dụng (!!!???).

 

=> Nói chung vấn đề nằm ở chỗ chèn block trụ điện không được đúng vị trí như ta mong muốn. Và 1 vấn đề nữa là không bít sao mà sau khi vẽ đường PLine đầu tiên vẫn hiện lên hộp thoại để nhập tiếp nhưng CAD còn hiện thêm thông báo "_VLD Unknown command "VLD". Press F1 for help." (???) Như zạ là em sai chỗ nào zạ???

 

Các bác copy các file của em về test thử júp em nhé!! xem júp em là em đã viết sai code chỗ nào zạ!? về phần block trụ điện vì trong bản vẽ của các bác chắc chắn sẽ chưa có 2 block là "Tru12" và "Tru10" thì các bác cứ tạo 2 block có tên y như vậy nhé, còn hình dạng block này như thế nào thì tùy các bác, miễn sao đại khái có block để test thử xem nó được chèn thế nào thui!!

 

Em nói dài dòng chứ thực ra các bác lúc test thử chắc sẽ hỉu "ý đồ" của em thui nhỉ! Mong các bác "ra tay nghĩa hiệp mổ xẻ" jùm cái đoạn LISP của em nhé!

 

Đang đợi REPLY của các bác! Trăm ngàn lần cảm ơn các bác!! :D

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

Theo quan điểm của mình thì lỗi có thể do các nguyên do sau đây :

1. Thiếu câu lệnh để đưa hệ trục XYZ về 1 hệ trục chuẩn như sau :

(command "ucs" "")

2. Khi tạo Block chèn của bạn đưa về điểm chuẩn chưa đúng

Bạn kiểm tra xem thử file AutoCad chứa block của bạn có điểm gốc 0,0 nằm ở đâu

vì câu lệnh INSERT lúc chèn từ 1 file bất kỳ sẽ lấy điểm chèn là điểm 0,0

và bạn cần sửa lại file gốc chứa block là đưa BLOCK trụ điện có điểm gốc của móng trụ điện về điểm 0,0 là OK

 

 

Bon ... on ...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
Theo quan điểm của mình thì lỗi có thể do các nguyên do sau đây :

1. Thiếu câu lệnh để đưa hệ trục XYZ về 1 hệ trục chuẩn như sau :

(command "ucs" "")

2. Khi tạo Block chèn của bạn đưa về điểm chuẩn chưa đúng

Bạn kiểm tra xem thử file AutoCad chứa block của bạn có điểm gốc 0,0 nằm ở đâu

vì câu lệnh INSERT lúc chèn từ 1 file bất kỳ sẽ lấy điểm chèn là điểm 0,0

và bạn cần sửa lại file gốc chứa block là đưa BLOCK trụ điện có điểm gốc của móng trụ điện về điểm 0,0 là OK

Bon ... on ...n

 

Bác ơi bác xem júp thêm cái lỗi "_VLD Unknown command "VLD". Press F1 for help." lun nhá bác! Cám ơn bác nhìu lắm! E chẳng hỉu sai chỗ nào mà vẽ xong đường PLine đầu tiên thì CAD vẫn xuất hiện hộp thoại và kèm theo thông báo lỗi 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

"Dục Tốc Bất Đạt"

Chú cứ từ từ, khoan sử dụng menuload cái đã

Khi nào sử dụng thành thạo và câu lệnh Autolisp chạy OK thì mới lồng tiếp câu lệnh load menu

Chú thử riêng cái này anh mới sửa thử xem nhé

 

;;;=====GIOI THIEU==================
(defun C:aboutVLD (/ i)
       
 (setq i (load_dialog "VLD\\VLD.DCL"))
       
 (if (not (new_dialog "about_VLD" i))
   (exit)
 )
       
 (action_tile "accept" "(done_dialog)")
       
 (start_dialog)
       
 (unload_dialog i)
)
;;;==============DIALOG===================
(defun Dialog_Ve (/ i)
     
 (setq i (load_dialog (strcat path "VLD.DCL")))
       
 (if (not (new_dialog "ve" i))
   (exit)
 )
     
 (if dai
   (set_tile "dai" (rtos dai 2 2))
   (set_tile "dai" "100.00")
 )
 (setq dai (distof (get_tile "dai")))

 (if goc
   (set_tile "goc" (rtos goc 2 2))
   (set_tile "goc" "45.00")
 )
 (setq goc (distof (get_tile "goc")))
;;;-------------------
 (if (not tru)
   (setq tru 1)
 )
 (cond	((= tru 1) (mode_tile "t12" 2))
((= tru 2) (mode_tile "t10" 2))
 )
 (action_tile "t12" "(setq tru 1)")
 (action_tile "t10" "(setq tru 2)")

;;;-------------------
 (if (not point)
   (setq point 1)
 )
 (cond	((= point 1) (mode_tile "diem1" 2))
((= point 2) (mode_tile "diem2" 2))
 )
 (action_tile "diem1" "(setq point 1)")
 (action_tile "diem2" "(setq point 2)")
;;;

 (action_tile "dai" "(setq dai (distof (get_tile \"dai\")))")
 (action_tile "goc" "(setq goc (distof (get_tile \"goc\")))")

 (action_tile "cancel" "(done_dialog) (exit)")
     
 (action_tile "accept" "(LaySoLieu) (done_dialog)")
     
 (start_dialog)
     
 (unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu ()
 (setq
       L (atof (get_tile "dai"))
       G (angtof (get_tile "goc"))
 )
     
 (if (= (get_tile "t12") "1")
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )
       
 (if (= (get_tile "diem1") "1")
   (setq A P1)
   (setq A P2)
 )
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
 (setq P1 (getpoint "Click chon 1 diem dau tien: "))
 (setq	PX     (car P1)
PY     (cadr P1)
ptzoom p1
 )
 (setq TPX (* (cos G) L))
 (setq TPY (* (sin G) L))
 (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
 (setq OLDOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (command "pline" P1 P2 "")
 (command "insert" E A 1 1 "")
 (while (/= L nil)
   (setq PX (car P2)
  PY (cadr P2)
   )
   (setq P1 (list PX PY 0.0))
   (Dialog_Ve)
   (setq TPX (* (cos G) L))
   (setq TPY (* (sin G) L))
   (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
   (command "pline" P1 P2 "")
   (command "insert" E A 1 1 "")
   (command "zoom" ptzoom p2)
   (command "zoom" "S" "0.7xp")
 )
 (setvar "OSMODE" OLDOS)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/)
     
 (setq path "C:\\Design\\")
 (Dialog_Ve)
     
 (Ve L G E)
)
(princ)

 

Chỉ cần thay đường dẫn của biến path của riêng chú vào

Bỏ các file *.DCL *.dwg của block vào là OK

Có j pm anh

 

Bon ... on ... 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ục Tốc Bất Đạt"

Chú cứ từ từ, khoan sử dụng menuload cái đã

Khi nào sử dụng thành thạo và câu lệnh Autolisp chạy OK thì mới lồng tiếp câu lệnh load menu

Chú thử riêng cái này anh mới sửa thử xem nhé

 

;;;=====GIOI THIEU==================
(defun C:aboutVLD (/ i)
       
 (setq i (load_dialog "VLD\\VLD.DCL"))
       
 (if (not (new_dialog "about_VLD" i))
   (exit)
 )
       
 (action_tile "accept" "(done_dialog)")
       
 (start_dialog)
       
 (unload_dialog i)
)
;;;==============DIALOG===================
(defun Dialog_Ve (/ i)
     
 (setq i (load_dialog (strcat path "VLD.DCL")))
       
 (if (not (new_dialog "ve" i))
   (exit)
 )
     
 (if dai
   (set_tile "dai" (rtos dai 2 2))
   (set_tile "dai" "100.00")
 )
 (setq dai (distof (get_tile "dai")))

 (if goc
   (set_tile "goc" (rtos goc 2 2))
   (set_tile "goc" "45.00")
 )
 (setq goc (distof (get_tile "goc")))
;;;-------------------
 (if (not tru)
   (setq tru 1)
 )
 (cond	((= tru 1) (mode_tile "t12" 2))
((= tru 2) (mode_tile "t10" 2))
 )
 (action_tile "t12" "(setq tru 1)")
 (action_tile "t10" "(setq tru 2)")

;;;-------------------
 (if (not point)
   (setq point 1)
 )
 (cond	((= point 1) (mode_tile "diem1" 2))
((= point 2) (mode_tile "diem2" 2))
 )
 (action_tile "diem1" "(setq point 1)")
 (action_tile "diem2" "(setq point 2)")
;;;

 (action_tile "dai" "(setq dai (distof (get_tile \"dai\")))")
 (action_tile "goc" "(setq goc (distof (get_tile \"goc\")))")

 (action_tile "cancel" "(done_dialog) (exit)")
     
 (action_tile "accept" "(LaySoLieu) (done_dialog)")
     
 (start_dialog)
     
 (unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu ()
 (setq
       L (atof (get_tile "dai"))
       G (angtof (get_tile "goc"))
 )
     
 (if (= (get_tile "t12") "1")
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )
       
 (if (= (get_tile "diem1") "1")
   (setq A P1)
   (setq A P2)
 )
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
 (setq P1 (getpoint "Click chon 1 diem dau tien: "))
 (setq	PX     (car P1)
PY     (cadr P1)
ptzoom p1
 )
 (setq TPX (* (cos G) L))
 (setq TPY (* (sin G) L))
 (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
 (setq OLDOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (command "pline" P1 P2 "")
 (command "insert" E A 1 1 "")
 (while (/= L nil)
   (setq PX (car P2)
  PY (cadr P2)
   )
   (setq P1 (list PX PY 0.0))
   (Dialog_Ve)
   (setq TPX (* (cos G) L))
   (setq TPY (* (sin G) L))
   (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
   (command "pline" P1 P2 "")
   (command "insert" E A 1 1 "")
   (command "zoom" ptzoom p2)
   (command "zoom" "S" "0.7xp")
 )
 (setvar "OSMODE" OLDOS)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/)
     
 (setq path "C:\\Design\\")
 (Dialog_Ve)
     
 (Ve L G E)
)
(princ)

 

Chỉ cần thay đường dẫn của biến path của riêng chú vào

Bỏ các file *.DCL *.dwg của block vào là OK

Có j pm anh

 

Bon ... on ... n

 

Hic... Bác ui! em đã thử đoạn lisp bác sửa rùi, bỏ các file *.DCL *.dwg của block và thay đường dẫn lun nhưng lisp của bác vẫn gặp lỗi y như của em và còn kèm thêm 1 vài lỗi nữa như là nếu mà chọn "Diem 2" trong hộp thoại hoặc chọn "Tru 10.5m" thì bị lỗi "Fucntion Canceled" (T T)

 

Vấn đề không bít fải ở chỗ đoạn này k "if (= (get_tile "diem1") "1") (setq A P1) (setq A P2))" vì nều em tạm thời bỏ đoạn này và chỗ lệnh INSERT thì viết là "(command "insert" E P1 1 1 "")" thì CAD sẽ chèn đúng block vào điểm P1 khôn bị sai lệch vị trí gì cả. Còn nếu dùng đoạn "if (= (get_tile "diem1") "1") (setq A P1) (setq A P2))" để gán biến A cho P1 hoặc P2 thì block lại chèn không đúng vị trí. Em chẳng hỉu nổi.

 

Có bác nào júp em sáng tỏ hơn cá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

Chú thử thay dòng lệnh con này xem

Vì anh chay OK mà

(defun LaySoLieu ()
 (setq
       L dai
       G (angtof (rtos goc 2 4)) 
 )
     ;;; vị trí bẫy lỗi
 (if (= tru 1)
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )
       
 (if (= point 1)
   (setq A P1)
   (setq A P2)
 )
)

 

Và chú dùng chương trình Vlide có trong AutoCad 2000 trở lên bẫy lỗi thử xem nhé

Trên chương trình mình có nhiều biến số

cứ sau dấu ) là chú bấm phím F9

sau đó vào Tool chọn Load Text In Editor (Ctrl+Alt+E)

vào lại Cad

bấm lệnh VLD

chương trình sẽ chạy đến vị trí F9

Bấm tiếp F8 cho chương trình chạy tiếp

Nếu chương trình dừng chỗ nào thì chỗ đó câu lệnh sai (bị lỗi)

OK???

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ú thử thay dòng lệnh con này xem

Vì anh chay OK mà

(defun LaySoLieu ()
 (setq
       L dai
       G (angtof (rtos goc 2 4)) 
 )
     ;;; vị trí bẫy lỗi
 (if (= tru 1)
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )
       
 (if (= point 1)
   (setq A P1)
   (setq A P2)
 )
)

 

Và chú dùng chương trình Vlide có trong AutoCad 2000 trở lên bẫy lỗi thử xem nhé

Trên chương trình mình có nhiều biến số

cứ sau dấu ) là chú bấm phím F9

sau đó vào Tool chọn Load Text In Editor (Ctrl+Alt+E)

vào lại Cad

bấm lệnh VLD

chương trình sẽ chạy đến vị trí F9

Bấm tiếp F8 cho chương trình chạy tiếp

Nếu chương trình dừng chỗ nào thì chỗ đó câu lệnh sai (bị lỗi)

OK???

 

Cảm ơn anh nhưng tình hình có vẻ không khả quan hơn khi em thay lại đoạn lisp của anh. mà sao em làm các bước bẫy lỗi y chang như anh mà sao chẳng thấy chạy như anh miêu tả. Đến bước "vào lại CAD" "bấm lệnh VLD" thì nó chỉ chạy chương trình như bình thường thui chứ không "chạy đến vị trí F9" anh ah!!

 

Không bít có bác nào có cách jải quyết khác không ạ?? Hum nay mấy cao thủ đâu hết rùi hok bít!! sáng jờ cứ bị đoạn lisp này ám ảnh vì chưa gỡ đc khúc mắc làm em k thể nào tập trung vào công việc chính đc j cả. Hix!! Bây jờ đầu em mún nổ tung và còn bị sốt nữa... :D

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ôm trước bác 18011985 có cho em đoạn lisp để vẽ PLine liên tiếp cho đến khi nào nhấn phím space thì ngưng. Đoạn lisp như này:

 

;; free lisp from cadviet.com

(defun c:pla (/ CHIEUDAI D2 DX DY GOC TDX TDY QUYDOI)
 (setq d1 (getpoint "\n Nhap diem dau: "))
 (setq dx (car d1) dy (cadr d1))
 (defun quydoi ()
(setq chieudai (getreal "\n Nhap chieu dai: "))	
(if (/= chieudai nil)(progn
  (setq goc (getangle "\n Nhap goc: "))
  (setq tdx (* (cos goc) chieudai))
  (setq tdy (* (sin goc) chieudai))
  (setq d2 (list (+ dx tdx) (+ dy tdy) 0.0))
  (setq dx (car d2) dy (cadr d2))
  )
 )
)
 (quydoi)
 (entmake (list (cons 0 "POLYLINE")
	 (cons 6 "BYLAYER")
	 (cons 8 "net1")
	 (cons 62 1)
	 (cons 10 (list 0.0 0.0 0.0))
	 ))
 (entmake (list (cons 0 "VERTEX")
	 (cons 6 "BYLAYER")
	 (cons 8 "net1")
	 (cons 10 d1)
	 ))	
 (while (/= chieudai nil)
(entmake (list (cons 0 "VERTEX")
	   (cons 6 "BYLAYER")
	   (cons 8 "net1")
	   (cons 10 d2)
	   ))
(quydoi)
)
 (entmake (list (cons 0 "SEQEND")
	 (cons 6 "BYLAYER")
	 (cons 8 "net1")))
 (princ)
 )

 

Nhưng trong đoạn lisp trên em không hỉu lắm cách thức hoạt động cũng như ý nghĩa của Entity "VERTEX" và "SEQEND". Nếu được bác 18011985 hoặc bác nào hỉu rõ jải thích jùm cho em thông chỗ này nhé.

 

Cảm ơn các bác. Đừng trách em vì hỏi nhìu wá nhé vì em còn yếu kém lắm nên rất mong được học hỏi nhìu. :D

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ậy chú bẫy lỗi ngay từ đầu luôn xem thử

 

;;;=====GIOI THIEU==================
(defun C:aboutVLD (/ i)

 (setq i (load_dialog "VLD\\VLD.DCL"))

 (if (not (new_dialog "about_VLD" i))
   (exit)
 )

 (action_tile "accept" "(done_dialog)")

 (start_dialog)

 (unload_dialog i)
)
;;;==============DIALOG===================
(defun Dialog_Ve (/ i)

 (setq i (load_dialog (strcat path "VLD.DCL")))
       ;;;;hay la vi tri bam phim F9 o day
 (if (not (new_dialog "ve" i))
   (exit)
 )

 (if dai
   (set_tile "dai" (rtos dai 2 2))
   (set_tile "dai" "100.00")
 )
 (setq dai (distof (get_tile "dai")))

 (if goc
   (set_tile "goc" (rtos goc 2 2))
   (set_tile "goc" "45.00")
 )
 (setq goc (distof (get_tile "goc")))
;;;-------------------
 (if (not tru)
   (setq tru 1)
 )
 (cond	((= tru 1) (mode_tile "t12" 2))
((= tru 2) (mode_tile "t10" 2))
 )
 (action_tile "t12" "(setq tru 1)")
 (action_tile "t10" "(setq tru 2)")

;;;-------------------
 (if (not point)
   (setq point 1)
 )
 (cond	((= point 1) (mode_tile "diem1" 2))
((= point 2) (mode_tile "diem2" 2))
 )
 (action_tile "diem1" "(setq point 1)")
 (action_tile "diem2" "(setq point 2)")
;;;

 (action_tile "dai" "(setq dai (distof (get_tile \"dai\")))")
 (action_tile "goc" "(setq goc (distof (get_tile \"goc\")))")

 (action_tile "cancel" "(done_dialog) (exit)")

 (action_tile "accept" "(LaySoLieu) (done_dialog)")

 (start_dialog)

 (unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu ()
 (setq
       L (atof (get_tile "dai"))
       G (angtof (get_tile "goc"))
 )

 (if (= (get_tile "t12") "1")
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )

 (if (= (get_tile "diem1") "1")
   (setq A P1)
   (setq A P2)
 )
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
 (setq P1 (getpoint "Click chon 1 diem dau tien: "))
;;;;vi tri bam phim F9
 (setq	PX     (car P1)
PY     (cadr P1)
ptzoom p1
 )
 (setq TPX (* (cos G) L))
 (setq TPY (* (sin G) L))
 (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
 (setq OLDOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (command "pline" P1 P2 "")
 (command "insert" E A 1 1 "")
 (while (/= L nil)
   (setq PX (car P2)
  PY (cadr P2)
   )
   (setq P1 (list PX PY 0.0))
   (Dialog_Ve)
   (setq TPX (* (cos G) L))
   (setq TPY (* (sin G) L))
   (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
   (command "pline" P1 P2 "")
   (command "insert" E A 1 1 "")
   (command "zoom" ptzoom p2)
   (command "zoom" "S" "0.7xp")
 )
 (setvar "OSMODE" OLDOS)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/)

 (setq path "C:\\Design\\")
 (Dialog_Ve)

 (Ve L G E)
)
(princ)

 

Nếu không đựoc thì bẫy (đặt phím F9) ngay từ khi vô dialog luôn thử

Còn không thì bấm tổ hợp phím Ctrl+Shift+I khi con trỏ ở trước dấu ( của từng biến xem kết quả là biết liề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
Vậy chú bẫy lỗi ngay từ đầu luôn xem thử

 

;;;=====GIOI THIEU==================
(defun C:aboutVLD (/ i)

 (setq i (load_dialog "VLD\\VLD.DCL"))

 (if (not (new_dialog "about_VLD" i))
   (exit)
 )

 (action_tile "accept" "(done_dialog)")

 (start_dialog)

 (unload_dialog i)
)
;;;==============DIALOG===================
(defun Dialog_Ve (/ i)

 (setq i (load_dialog (strcat path "VLD.DCL")))
       ;;;;hay la vi tri bam phim F9 o day
 (if (not (new_dialog "ve" i))
   (exit)
 )

 (if dai
   (set_tile "dai" (rtos dai 2 2))
   (set_tile "dai" "100.00")
 )
 (setq dai (distof (get_tile "dai")))

 (if goc
   (set_tile "goc" (rtos goc 2 2))
   (set_tile "goc" "45.00")
 )
 (setq goc (distof (get_tile "goc")))
;;;-------------------
 (if (not tru)
   (setq tru 1)
 )
 (cond	((= tru 1) (mode_tile "t12" 2))
((= tru 2) (mode_tile "t10" 2))
 )
 (action_tile "t12" "(setq tru 1)")
 (action_tile "t10" "(setq tru 2)")

;;;-------------------
 (if (not point)
   (setq point 1)
 )
 (cond	((= point 1) (mode_tile "diem1" 2))
((= point 2) (mode_tile "diem2" 2))
 )
 (action_tile "diem1" "(setq point 1)")
 (action_tile "diem2" "(setq point 2)")
;;;

 (action_tile "dai" "(setq dai (distof (get_tile \"dai\")))")
 (action_tile "goc" "(setq goc (distof (get_tile \"goc\")))")

 (action_tile "cancel" "(done_dialog) (exit)")

 (action_tile "accept" "(LaySoLieu) (done_dialog)")

 (start_dialog)

 (unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu ()
 (setq
       L (atof (get_tile "dai"))
       G (angtof (get_tile "goc"))
 )

 (if (= (get_tile "t12") "1")
   (setq E (strcat path "Tru12.dwg"))
   (setq E (strcat path "Tru10.dwg"))
 )

 (if (= (get_tile "diem1") "1")
   (setq A P1)
   (setq A P2)
 )
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
 (setq P1 (getpoint "Click chon 1 diem dau tien: "))
;;;;vi tri bam phim F9
 (setq	PX     (car P1)
PY     (cadr P1)
ptzoom p1
 )
 (setq TPX (* (cos G) L))
 (setq TPY (* (sin G) L))
 (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
 (setq OLDOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (command "pline" P1 P2 "")
 (command "insert" E A 1 1 "")
 (while (/= L nil)
   (setq PX (car P2)
  PY (cadr P2)
   )
   (setq P1 (list PX PY 0.0))
   (Dialog_Ve)
   (setq TPX (* (cos G) L))
   (setq TPY (* (sin G) L))
   (setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
   (command "pline" P1 P2 "")
   (command "insert" E A 1 1 "")
   (command "zoom" ptzoom p2)
   (command "zoom" "S" "0.7xp")
 )
 (setvar "OSMODE" OLDOS)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/)

 (setq path "C:\\Design\\")
 (Dialog_Ve)

 (Ve L G E)
)
(princ)

 

Nếu không đựoc thì bẫy (đặt phím F9) ngay từ khi vô dialog luôn thử

Còn không thì bấm tổ hợp phím Ctrl+Shift+I khi con trỏ ở trước dấu ( của từng biến xem kết quả là biết liền

 

Cảm ơn bác đã nhiệt tình júp đỡ em ạ! Em đang vẫn dùng Lisp ban đầu của em và đã thử sửa lại nó như sau:

 

;;;==============DIALOG===================
(defun Dialog_Ve1(/ i)
(setq i (load_dialog "ALD\\VLD.DCL"))
 	(if (not (new_dialog "dve" i)) (exit))
(set_tile "dai" "100")
(set_tile "goc" "45")
(action_tile "cancel" "(done_dialog)(exit)")
(action_tile "accept" "(LaySoLieu)(done_dialog)")
(start_dialog)
(unload_dialog i)
)
(defun Dialog_Ve2(/ i)
(setq i (load_dialog "ALD\\VLD.DCL"))
 	(if (not (new_dialog "ved" i)) (exit))
(action_tile "accept" "(LaySoLieu2)(done_dialog)")
(start_dialog)
 	(unload_dialog i)
)
;;;=============LAY SO LIEU NHAP=============
(defun LaySoLieu()
(setq
L (distof (get_tile "dai"))
G (angtof (get_tile "goc"))
)
(if (= (get_tile "t12") "1") (setq E "T12"))
 	(if (= (get_tile "t10") "1") (setq E "T10"))
)
(defun LaySoLieu2()
(if (= (get_tile "diem1") "1") (setq P P1))
 	(if (= (get_tile "diem2") "1") (setq P P2))
)
;;;=============CHUONG TRINH VE==============
(defun Ve (L G E)
(setq PX (car P1) PY (cadr P1))
(setq TPX (* (cos G) L))
(setq TPY (* (sin G) L))
(setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
(command "pline" P1 P2 "")
(Dialog_Ve2)
(command "insert" E P 1 1 "")
(while (/= "cancel" T)
	(setq PX (car P2) PY (cadr P2))
	(setq P1 (list PX PY 0.0))
	(Dialog_Ve1)
	(setq TPX (* (cos G) L))
	(setq TPY (* (sin G) L))
	(setq P2 (list (+ PX TPX) (+ PY TPY) 0.0))
 		(command "pline" P1 P2 "")
 		(Dialog_Ve2)
	(command "insert" E P 1 1 "")
)
)
;;;==============CHUONG TRINH CHINH=============
(defun C:AVLD ()
 	(setq P1 (getpoint "Click chon 1 diem dau tien: "))
(Dialog_Ve1)
(Ve L G E)
)
(princ)

 

Và:

 

//VE1
dve:dialog 
{label = "Chuong Trinh Tu Dong Ve Luoi Dien";
: edit_box {label = "Nhap khoang cach"; key = "dai"; edit_width = 15;}
: edit_box {label = "Nhap huong goc"; key = "goc"; edit_width = 15;}
:boxed_radio_column
{label = "Chon loai tru";
 		: radio_button {label = "&Tru 12m"; key = "t12";}
	: radio_button {label = "T&ru 10.5m"; key = "t10";}
}
spacer;
ok_cancel;
}
//VE2
ved:dialog 
{label = "Chuong Trinh Tu Dong Ve Luoi Dien";
:boxed_radio_column
{label = "Chon diem chen";
 		: radio_button {label = "Diem 1"; key = "diem1";}
 		: radio_button {label = "Diem 2"; key = "diem2";}
 	}
 	spacer;
ok_only;
}
//ABOUT VLD
about_VLD: dialog
{label = "Gioi thieu";
    :text {alignment = centered; label = "CHUONG TRINH TU DONG VE LUOI DIEN VLD 1.0";}
     ok_only;
}

 

Thì đã khắc phục được vấn đề chèn điểm sai vị trí. Bây jờ em chèn block vào điểm đầu hay điểm cuối đều OK cả. Nhưng cái dở là sau khi vẽ xong Pline phải thêm 1 dialog để chọn điểm chèn sau đó mới chèn block vào điểm chọn của PLine.

 

Em đoán lỗi của đoạn lisp ban đầu của em là ở chỗ này:

 

(if (= (get_tile "diem1") "1") (setq A P1) (setq A P2))

 

Vì lúc diễn ra hàm get_tile thì điểm P1 và P2 vẫn chưa được xác định (ta chưa click chọn điểm P1) mà ta đã gán biến AP1.

 

Em chỉ đoán vấn đề nằm ở chỗ này nhưng không bít fân tích nó ra sao. Mong các bác cao thủ xem lại Lisp ban đầu và Lisp sau khi sửa của em một lần nữa và tìm ra nguyên nhân phân tích jùm cho em hỉu rõ nguyên nhân của lỗi này do đâu nhé!!

 

Cảm ơn các bác đã hỗ trợ em nhì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
....................

Em chỉ đoán vấn đề nằm ở chỗ này nhưng không bít fân tích nó ra sao. Mong các bác cao thủ xem lại Lisp ban đầu và Lisp sau khi sửa của em một lần nữa và tìm ra nguyên nhân phân tích jùm cho em hỉu rõ nguyên nhân của lỗi này do đâu nhé!!

 

Cảm ơn các bác đã hỗ trợ em nhìu ạ!!

Thật sự mà nói : Tìm nguyên nhân và cách khắc phục khó (mất nhiều Time) hơn là viết mới (trên nền ý tưởng của bạn).

 

Bạn thử LISP này nhé.

;=============CHUONG TRINH VE==============
(defun Ve (p1 p2 e a / pt OLDOS)
 (setq OLDOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (command "pline" P1 p2 "")
 (if (= a "diem1")
   (setq pt p1)
   (setq pt p2) )
 (command "insert" E pt 1 1 "")  
 (setvar "OSMODE" OLDOS))
;=============LAY SO LIEU NHAP=============
(defun LaySoLieu ()
 (setq Ch_dai (get_tile "dai")
goc (get_tile "goc")
p2 (polar p1 (angtof goc) (atof Ch_dai)))
 (if (= (get_tile "t12") "1")
   (setq blk_name "t12")
   (setq blk_name "t10")  )
 (if (= (get_tile "diem1") "1")
   (setq ins_pos "diem1")
   (setq ins_pos "diem2")  ))

(defun Dialog (l g e a / dcl_id dcflag)
 ;(setq dcl_id (load_dialog "temp.DCL"))
 (setq dcl_id (load_dialog "VLD.DCL"))  
 (while (not (vl-position dcflag '(0 1 )))
   (if (not (new_dialog "ve" dcl_id))
     (exit))
   (set_tile "dai" l)
   (set_tile "goc" g)
   (if (= e "t12")
     (set_tile "t12" "1")
     (set_tile "t10" "1") )
   (if (= a "diem1")
     (set_tile "diem1" "1")
     (set_tile "diem2" "1") )
   (action_tile "cancel" "(done_dialog 0)")
   (action_tile "accept" "(LaySoLieu)(done_dialog 1)")
   (setq dcflag (start_dialog))
   );while
 (unload_dialog dcl_id)
 dcflag)
;;;==============CHUONG TRINH CHINH=============
(defun C:VLD (/ p1 p2)  
 (setq P1 (getpoint "Click chon diem bat dau : "))
 ;INIT
 (or Ch_dai (setq Ch_dai "1000"))
 (or goc (setq goc "45"))
 (or blk_name (setq blk_name "t12"))
 (or ins_pos (setq ins_pos "diem1"))

 (while p1       
   (if (= 1 (Dialog Ch_dai goc blk_name ins_pos))
     (progn
(Ve p1 p2 blk_name ins_pos)
(setq P1 p2) )
     (setq P1 nil))    )
 (princ)  )

 

File VLD.DCL

//VE
ve:dialog 
{label = "Chuong Trinh Tu Dong Ve Luoi Dien";
   : edit_box {label = "Nhap khoang cach"; key = "dai"; edit_width = 15;}
   : edit_box {label = "Nhap huong goc"; key = "goc"; edit_width = 15;}
   :boxed_radio_column
   {label = "Chon loai tru";
       : radio_button {label = "&Tru 12m"; key = "t12";}
       : radio_button {label = "T&ru 10.5m"; key = "t10";}
   }
   :boxed_radio_column
   {label = "Chon diem chen";
         : radio_button {label = "Diem dau"; key = "diem1";}
         : radio_button {label = "Diem cuoi"; key = "diem2";}
     }
     spacer;
ok_cancel;
}

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ưởng của mình là viết 1 đoạn lisp để cad vẽ 1 đường PLINE, yêu cầu người dùng nhập vào: điểm đầu của đường thẳng, chiều dài đường thẳng và góc mà đường thẳng đó hợp với phương mặt phẳng ngang.

 

Ví dụ: đoạn thẳng cần vẽ có chiều dài là 100 và hướng theo 1 góc xéo 45 độ. Bình thường nếu vẽ trong cad phải thao tác như sau:

- gõ lệnh pline

- click chọn điểm đầu tiên (first point)

- sau đó ở dòng lệnh second point nhập vào: @100<45

 

Và dưới đây là đoạn lisp mà mình viết nhưng không cho ra kết quả như mong muốn mà cho kết quả là "UNKNOW DPL..." (lệnh mà mình viết là DPL):

 

(defun c:dpl()
(setq P1 (getpoint "cho diem dau: "))
(setq L (getint "nhap chieu dai: "))
(setq G (getint "nhap so goc: "))
(setq P2 (list @ L < G))
(command "pline" P1 P2 "")
(princ)
)

 

Mình biết chắc là đoạn lisp trên có sai nhưng mình không biết sửa như thế nào! Mình chỉ mới tìm hiểu lisp trên diễn đàn CADVIET thui nên chưa rành lắm. Mong các bác có kinh nghiệm chỉ bảo giủp. Nếu được thì bác nào hướng dẫn cho cách viết đoạn lisp để thực hiện ý tưởng trên.

 

CẢM ƠN CÁC BÁC RẤT RẤT NHIỀU!

Các bác cho e hỏi làm sao để gán luôn giá trị L =2 và g=45 độ trong lisp trên của mac hung, e dùng hàm setvar nhưng không biết làm thế nào. Trả lời hộ e nhé. e đang mắc chỗ gán giá trị cho biến 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

Các Bác ui! E đã hoàn thành xong chương trình theo ý tưởng của mình rùi!! Bây jờ đem sản phẩm lên khoe với các bác nè!

 

Đây là menu:

 

menuvld.png

 

Và đây là hộp thoại chương trình:

 

hopthoai1.png

  • 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

Các bác ui! Bây jờ em làm xong chương trình rồi mới phát hiện ra là khi nhập các dữ liệu vào các edit_box trong hộp thoại, em muốn nhấn nút ENTER để thực thi việc vẽ thay cho việc click vào nút VE nhưng không được, mà sau khi nhập dữ liệu xong phải click nút VE mới được.

 

Các bác júp em với! Chỉ em đoạn mã hoặc lệnh nào để mình có thể định sẵn khi nhập dữ liệu xong người dùng chỉ cần nhấn ENTER là thực thi việc vẽ luôn!

 

Các bác júp em nhé! Em đội ơn trời biển của các bác nhìu lắm lắ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

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

×