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ị

Thực ra là mình đang tìm hiểu về vẽ hình bằng lisp,thấy vẽ cái này là đơn giản nhất nên nhờ các bạn viết giùm để mình học hỏi.Trong yêu cầu này thì theo mình hiểu là vẽ một đường thẳng dài 800,cách đường này 1 đoạn 225 theo phương đứng là 1 đoạn dài 400,tại 2 đầu của đoạn 400 sẽ vẽ 2 đường xuống trung điểm của đường 800 tạo thành 1 tam giác và được hatch,tạo 1 text cao 250 nằm trên đường 400 một đoạn 160,sau đó sẽ tạo hình này thành 1 block ATT,kết thúc.Mong các bác viết giùm để học hỏ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

Mình thấy nó đâu có đơn giản đâu nhỉ ^^ Về cách thức thì cực đơn giản, nhưng nếu bạn bắt đầu nghiên cứu nó thì có lẽ topic này không phù hợp rồi, bạn chuyển qua bên HD học lisp, hoặc Cùng nhau học Lisp... đi ^^. Trong tay bạn đã có những gì rồi? sao bạn không thử bắt tay vào làm từng mảng 1 xem sao ??

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình mới bắt đầu thôi,nếu bạn rảnh viết giùm mình lisp này để tham khảo được không?Cảm ơn sự nhiệt tình của bạn từ đầu đến giờ.

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 sẽ giúp bạn nếu bạn phân tích rõ hộ mình các bước sau đây, bước nào bạn có thể làm được, và bước nào chưa? Còn nếu chưa tất thì, như mình nói, bạn phải xây lên từ viên gạch đầu tiên đã ^^

1 - Tạo các layer 1,2,3,4... dùng cho hình vẽ

2 - Tính điểm a1 cách điểm a 1 khoảng cách và góc đã biết

3 - Kẻ 1 Line với chiều dài, góc cho trước từ 1 điểm user click

4 - Hatch 1 đối tượng, hatch 1 vùng, sử dụng các biến "hp*"

5 - Tạo ATT/ TEXT

6 - Gom các đối tượng và tạo Block

??

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình mới bắt đầu thôi,mình chỉ hiểu những gì đã viết ở trên,còn bắt đầu vô viết thì chưa.Đây là bài toán mình đưa ra nên có lời giải thì mình cảm thấy học được nhanh hơn,đây là ý nghĩ của mình.Cảm ơn bạn nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình mới bắt đầu thôi,mình chỉ hiểu những gì đã viết ở trên,còn bắt đầu vô viết thì chưa.Đây là bài toán mình đưa ra nên có lời giải thì mình cảm thấy học được nhanh hơn,đây là ý nghĩ của mình.Cảm ơn bạn nhiều.

Của bạn đây :

Tue_NV viết theo cách dễ hiểu nhất cho bạn.

Việc còn lại của bạn là gán Layer cho LINE, PLINE, Hatch att và gom chúng trong 1 Block

(defun TAOLAYER(name color)
 (if (not (Tblsearch "Layer" name))
   (command "layer" "m" name "c" color "" "")
 )
)
(defun c:Smake(/ oldos p1 p2 p3 line pline Hatch)
 (command "undo" "be")
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setvar "cmdecho" 0)
 ;;;Taolayer
 (TaoLayer "1" 2)
 (TaoLayer "2" 8)
 (TaoLayer "S13. HATCH" 1)
 ;;;Ve
 (setq p1 (getpoint "\n Diem dau tien :")
p2 (polar p1 0 800)
p3 (polar p1 0 300)
 )
 (command "line" p1 p2 "")
 (setq line (entlast))
 (command "pline" p3 "@-200,225" "@400,0" "C")
 (setq pline (entlast))
 (command "hatch" "S" pline "" "p" "S")
 (setq Hatch (entlast))
 (command "style" "VNI" "vhelvcn.ttf" "0" "1" "0" "n" "n")
 (command "ATTDEF" "" "cos" "cos :" "%%p0.000" "S" "VNI"
   (list (- (car p3) 200) (+ (cadr p3) 385) 0.0)
   "250" "0")
 (setq att (entlast))
 (setvar "osmode" oldos)
 (command "undo" "e")
 (princ)
)

Hy vọng bạn 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

Cảm ơn bác,gán layer thì e làm được nhưng tạo cho nó thành block ATT thì không biêt,mong bác giúp.Thanks.

Của bạn đây. Bạn tự tìm hiểu nhé.

Chúc thành công

(defun TAOLAYER(name color)
 (if (not (Tblsearch "Layer" name))
   (command "layer" "m" name "c" color "" "")
 )
)
(defun c:Smake(/ oldos p1 p2 p3 line pline Hatch)
 (command "undo" "be")
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setvar "cmdecho" 0)
 ;;;Taolayer
 (TaoLayer "1" 2)
 (TaoLayer "2" 8)
 (TaoLayer "S13. HATCH" 1)
 ;;;Ve
 (setq p1 (getpoint "\n Diem dau tien :")
p2 (polar p1 0 800)
p3 (polar p1 0 300)
p4 (list (- (car p3) 200) (+ (cadr p3) 385) 0.0)
 )
 (command "line" p1 p2 "")
 (setq line (entlast))
 (command "pline" p3 "@-200,225" "@400,0" "C")
 (setq pline (entlast))
 (command "bhatch" "p" "S" "S" pline "" "")
 (setq Hatch (entlast))
 (command "style" "VNI" "vhelvcn.ttf" "0" "1" "0" "n" "n")
 (command "ATTDEF" "" "cos" "cos :" "%%p0.000" "S" "VNI" p4 "250" "0")
 (setq att (entlast))

(command "copybase" p4 line pline att hatch "")
(command "pasteblock" p4) 
(if line (entdel line))
(if pline (entdel pline))
(if att (entdel att))
(if hatch (entdel hatch))
 (setvar "osmode" oldos)
 (command "undo" "e")
 (princ)
)

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 rất nhiều,tiện thể cho e hỏi muốn đặt tên cho block ATT này luôn thì viết thêm dòng nào?

Ngâm cứu nhé bạn :


(defun TAOLAYER(name color)
 (if (not (Tblsearch "Layer" name))
   (command "layer" "m" name "c" color "" "")
 )
)
(defun c:Smake(/ oldos p1 p2 p3 line pline Hatch ten)
 (command "undo" "be")
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setvar "cmdecho" 0)
 ;;;Taolayer
 (TaoLayer "1" 2)
 (TaoLayer "2" 8)
 (TaoLayer "S13. HATCH" 1)
 ;;;Ve
 (setq p1 (getpoint "\n Diem dau tien :")
p2 (polar p1 0 800)
p3 (polar p1 0 300)
p4 (list (- (car p3) 200) (+ (cadr p3) 385) 0.0)
 )
 (command "line" p1 p2 "")
 (setq line (entlast))
 (command "pline" p3 "@-200,225" "@400,0" "C")
 (setq pline (entlast))
 (command "bhatch" "p" "S" "S" pline "" "")
 (setq Hatch (entlast))
 (command "style" "VNI" "vhelvcn.ttf" "0" "1" "0" "n" "n")
 (command "ATTDEF" "" "cos" "cos :" "%%p0.000" "S" "VNI" p4 "250" "0")
 (setq att (entlast))

(command "copybase" p4 line pline att hatch "")
(command "pasteblock" p4) 
(while (and (tblsearch "Block" (setq ten (getstring "\n Nhap ten Block/ Enter: Khong dat ten")))
	    (/= ten "")
	)
	(alert "\n Ten Block da co => dat ten khac")
)

(if line (entdel line))
(if pline (entdel pline))
(if att (entdel att))
(if hatch (entdel hatch))
(if (/= ten "") (command "rename" "B" (cdr(assoc 2 (entget(entlast)))) ten))

 (setvar "osmode" oldos)
 (command "undo" "e")
 (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

Cảm ơn sự nhiệt tình giúp đỡ của bạn,mình đã dần biết,cho mình hỏi lần cuối,ngay ô nhập vào tên block nếu mình muốn để sẵn 1 tên nào đó chỉ việc enter là nó là tên block luôn và vẫn có thể nhập tên khác vào ô này,không cần chức năng không đặt tê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

em cần viết lisp theo yêu cầu sau:

- dùng lệnh pline

- chọn điểm 1 (chọn điểm A trong hình)

- Chọn kiểu vẽ là cung: A

(*)- Chọn cung qua 2 điểm: S

- Chọn điểm 2 (chọn điểm B trong hình)

- Chọn điểm 3 (Điểm C trong hình)

- Tiếp tục lặp lại từ (*). Số lần lặp là tùy ý theo điểm mình chọn.

3172011_110929_pm.jpg

Mong các anh giúp dù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

em cần viết lisp theo yêu cầu sau:

- dùng lệnh pline

- chọn điểm 1 (chọn điểm A trong hình)

- Chọn kiểu vẽ là cung: A

(*)- Chọn cung qua 2 điểm: S

- Chọn điểm 2 (chọn điểm B trong hình)

- Chọn điểm 3 (Điểm C trong hình)

- Tiếp tục lặp lại từ (*). Số lần lặp là tùy ý theo điểm mình chọn.

3172011_110929_pm.jpg

Mong các anh giúp dùm!

Các điểm A,B,C,D.... này của bạn nằm theo quy luật nào. bạn không cho quy luật thì rất khó thực hiện.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các điểm A,B,C,D.... này của bạn nằm theo quy luật nào. bạn không cho quy luật thì rất khó thực hiện.

dạ, các điểm này nằm trên các đối tượng khác (end, near, mid,...)do mình chọn trên bảng vẽ.

ví dụ như mình có sơ đồ bố trí các thiết bị như hình vẽ, muốn nối các thiết bị lại bằng sơ đồ đơn tuyến.

3172011_115038_pm.jpg

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 cần viết lisp theo yêu cầu sau:

- dùng lệnh pline

- chọn điểm 1 (chọn điểm A trong hình)

- Chọn kiểu vẽ là cung: A

(*)- Chọn cung qua 2 điểm: S

- Chọn điểm 2 (chọn điểm B trong hình)

- Chọn điểm 3 (Điểm C trong hình)

- Tiếp tục lặp lại từ (*). Số lần lặp là tùy ý theo điểm mình chọn.

3172011_110929_pm.jpg

Mong các anh giúp dùm!

Đêm hơi khuya, mình viết vội cái này. Nếu bạn sử dụng có trở ngại gì thì sáng mai mình sẽ sửa lại

http://www.cadviet.com/upfiles/3/ve_cung_tron.lsp

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 sự nhiệt tình giúp đỡ của bạn,mình đã dần biết,cho mình hỏi lần cuối,ngay ô nhập vào tên block nếu mình muốn để sẵn 1 tên nào đó chỉ việc enter là nó là tên block luôn và vẫn có thể nhập tên khác vào ô này,không cần chức năng không đặt tên.

Block chỉ có 1 tên thôi. Bạn đặt tên trùng => nó không chịu đâu.

Nếu bạn muốn để sẵn 1 tên nào đó chỉ việc enter là nó là tên block luôn. Nếu nó đã có rồi thì nó không chịu đâu. Buộc lòng bạn phải đặt tên khác

Tue_NV viết Lisp cho bạn là tạo Block không cần đặt tên sau đó Rename Block vừa tạo thành 1 tên khác. Nếu tên của Block là "", nó sẽ chấp nhận tạo Block mà không cần đặt tê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 là như bạn nói để sẵn 1 tên rồi enter nếu chưa có thì nó đặt tên đó,nếu có rồi thì phải đặt tên khác.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

Cái tên "sẵn" đấy nó là cái gì, lấy theo cách nào ? Bạn cần phải diễn đạt được chính xác ý đồ của mình để mọi người hiểu nhé :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lisp bác Tue_NV viết khi có yêu cầu nhập tên của block:ô để nhập tên là trống,nếu nhập vào thì sẽ là tên của block,nếu tên block đó có rồi thì nó không chịu phải nhập tên khác,nếu không nhập mà Enter luôn thì nó tự đặt tên.Ý của mình là trong ô để nhập tên nó có sẵn 1 tên chẳng hạn như 11 enter thì nếu chưa có tên này nó sẽ tạo tên này,nếu có rồi thì phải đổi tên khác.Chỉ vậy thôi bác ah.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lisp bác Tue_NV viết khi có yêu cầu nhập tên của block:ô để nhập tên là trống,nếu nhập vào thì sẽ là tên của block,nếu tên block đó có rồi thì nó không chịu phải nhập tên khác,nếu không nhập mà Enter luôn thì nó tự đặt tên.Ý của mình là trong ô để nhập tên nó có sẵn 1 tên chẳng hạn như 11 enter thì nếu chưa có tên này nó sẽ tạo tên này,nếu có rồi thì phải đổi tên khác.Chỉ vậy thôi bác ah.

Ý bác Tuệ hỏi chính là cái số "chẳng hạn" của bạn ấy, nó tạo theo quy luật nào. 1 lisp khó có thể có phần "chẳng hạn " được, làm sao vừa ý bạn đượ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

ý mình là như bạn nói để sẵn 1 tên rồi enter nếu chưa có thì nó đặt tên đó,nếu có rồi thì phải đặt tên khác.Thanks.

Bạn có thể tạo block không cần đặt tên như sau:

1. Chọn đối tượng cần tạo block rồi nhấn CTRL+C

2. Nhấn CTRL+SHIFT+V rồi pick 1 điểm trên màn hình.

BS: Xin lỗi các Bác em không đọc phía trên. Vẫn có thể tạo ra bolck không cần đặt tên bằng cách copy vào clipboast.

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ực chất việc random này hok khác gì với việc bác TUệ đặt anon block cả ^^, vấn đề ở đây là bạn hugo muốn biết cách đặt code để mặc định tên thôi.Thì khi nhận string "" -> đặt tên block là 11 đó, chắc bạn ấy tự mần được

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn có thể tạo block không cần đặt tên như sau:

1. Chọn đối tượng cần tạo block rồi nhấn CTRL+C

2. Nhấn CTRL+SHIFT+V rồi pick 1 điểm trên màn hình.

Ấn Ctrol+Shift+C hay hơn. Nó nằm trong code của Tue_NV

Lệnh copybase tạo Block theo điểm chèn do User định trước

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×