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ị

Ý 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!

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 sửa đoạn này

(setq P2 (list @ L < G))

Thành

(setq P2 (polar P1 (* (/ g 180.0 )pi) L))

  • 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ì cách nhập trực tiếp trên cad không giống như câu lệnh của Autolisp nên

bạn thử đoạn này xem để so sánh nhé. Có gì pm

(defun c:dpl ()
 (setq P1 (getpoint "cho diem dau: "))
 (setq L (getreal "nhap chieu dai: "))
 (setq G (getangle "nhap so goc: "))
 (setq P2 (polar P1 G L))
 (command "pline" P1 P2 "")
 (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
Ý 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!

 

Sửa thành như này:

 

(defun c:dpl()

(setq P1 (getpoint "cho diem dau: "))

(setq L (getstring 5"nhap chieu dai: "))

(setq G (getstring 5"nhap so goc: "))

(setq P2 (strcat "@" L "<" G))

(command "pline" P1 P2 "")

(princ)

)

 

-Hai bác trên dùng hàm polar.

-Mình dùng hàm strcat cho trực quan bạn dể hiểu.

+Cách dùng hàm:

 

(setq ketqua (strcat "giatri1" bien1 "giatri2" bien2))

Trong đó strcat là hàm ghép.

Giá trị nằm trong "" là giá trị cố định.

Giá trị nằm ngoài "" là biến phải gán giá trị cho nó trước.

Các giá trị muốn ghép cách nhau 1 khoảng trắng.

  • 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

Woa! Thanks các bác nhìu nhìu lắm!!! :D

 

Các cách trên em đã thử và đã làm được hết và đúng ý tưởng của em rùi. Các bác đã júp em jải wuyết đc một vấn đề rất lớn rùi đóa. Một lần nữa cảm ơn các bác rất rất rất nhìu. :D

 

Bây jờ em chỉ còn thêm một vấn đề nữa là làm sao cho lệnh DPL này sau khi vẽ xong một đường sẽ lặp lại tiến trình nhập số liệu và vẽ đến khi nào mình nhấn phím ESC thì kết thúc việc vẽ. Em nghĩ chắc phải dùng vòng lặp các bác 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

Bạn vẽ 2 điểm thì vẽ thế kia được nếu bạn muốn lặp lại để vẽ thì cũng được nhưng như thế kết quả thu được là những đoạn polyline rời dạc . Nên bạn thử dùng lsp này xem. Đáp ứng được các yêu cầu của bạn (Chú ý chỉ thoát và hoàn thành polyline khi chiều dài nhập vào là nil "Tức bạn gõ space hoặc enter", nếu bạn ấn ESC bạn phải làm lại từ đầu).

(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)
 )

Chúc các bạn sức khoẻ và tích cực đóng góp nhiều lsp hơn nữa cho diễn đà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
Bạn vẽ 2 điểm thì vẽ thế kia được nếu bạn muốn lặp lại để vẽ thì cũng được nhưng như thế kết quả thu được là những đoạn polyline rời dạc . Nên bạn thử dùng lsp này xem. Đáp ứng được các yêu cầu của bạn (Chú ý chỉ thoát và hoàn thành polyline khi chiều dài nhập vào là nil "Tức bạn gõ space hoặc enter", nếu bạn ấn ESC bạn phải làm lại từ đầu).

(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)
 )

Chúc các bạn sức khoẻ và tích cực đóng góp nhiều lsp hơn nữa cho diễn đàn.

 

Cảm ơn bác! Vì mình đang cần viết LISP để vẽ tự động mặt bằng tuyến lưới điện (mình đang làm khâu thiết kế trong ngành Điện). Mà 1 bản vẽ mặt bằng tuyến lưới điện yêu cầu không cần cao nhưng nếu vẽ bằng tay cũng mất khá nhìu thời gian cho nên mình muốn tự động hóa bằng cách chỉ cần nhập khoảng cách và hướng góc mà đường điện sẽ đi. Mình xin mô tả về bản vẽ mặt bằng tuyến lưới điện cơ bản của mình như sau:

 

- Lưới điện cần thể hiện gồm đường dây, trụ điện và các phụ kiện khác như: neo, tiếp địa...

- Đường dây sẽ được thể hiện bằng các đường PLine nối tiếp nhau. Khoảng cách giữa 2 điểm đầu và cuối của một đường PLine chính là khoảng cách giữa 2 trụ điện.

- Trên mỗi điểm đầu và điểm cuối sẽ bố trí lên đó 1 trụ điện và sẽ có thể có thêm neo hoặc tiếp địa.

 

Chỉ đơn giản là thế nhưng mình muốn viết LISP với ý tưởng như sau:

 

- Mình sẽ tạo một Menu Box để người dùng có thể tương tác nhập số liệu trên đó.

- Tạo các Block gồm: trụ điện, neo, tiếp địa...

- Người dùng sẽ nhập vào chiều dài đường dây và góc (để vẽ đường PLine như đã làm ở trên).

- Mỗi lúc vẽ 1 đường PLine, trong Menu Box sẽ có các List Box xổ xuống để người dùng lựa chọn sẽ đặt trụ điện, neo, tiếp địa... vào các điểm nút của mỗi đường PLine (CAD sẽ đặt các block như ta đã tạo ở trên vào các điểm đầu và cuối của đường PLine).

- Tiếp tục quay lại bước nhập vào chiếu dài đường dây và góc ở trên để vẽ tiếp 1 đường PLine nối tiếp vào điểm cuối của đường PLine vừa vẽ và thực hiện các bước tiếp theo cho đến khi giá trị chiều dài đường dây là NIL.

 

Không biết ý tưởng này của mình có khả thi không các Bác nhỉ?

Mình xin up lên hình chụp 1 bản vẽ về mặt bằng tuyến lưới điện mà mình thường vẽ để các Bác dễ hình dung. Trong hình các bác thấy đường dây đi thẳng vì mình chỉ chụp 1 góc bản vẽ thui nhưng thực tế thì đưòng dây sẽ có nhiều góc nữa.

 

THANK CÁC BÁC ĐÃ NHIỆT TÌNH JÚP ĐỠ EM RẤT NHÌU!!!

 

BANVEMAU.png

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 đối với Autolisp thì dễ hơn ăn ớt nữa

Nếu bạn có nhu cầu mình sẽ viết theo đơn đặt hàng của bạn bao gồm :

-Thiết kế trắc dọc+mặt bằng điện

- Tự động sắp xếp vô khung A3,A1,A0...

- Tự động in ấn các khổ giấy

- Tự động tiền chuyển vô tài khoản ... he he

 

Bon...on...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
Cái này đối với Autolisp thì dễ hơn ăn ớt nữa

Nếu bạn có nhu cầu mình sẽ viết theo đơn đặt hàng của bạn bao gồm :

-Thiết kế trắc dọc+mặt bằng điện

- Tự động sắp xếp vô khung A3,A1,A0...

- Tự động in ấn các khổ giấy

- Tự động tiền chuyển vô tài khoản ... he he

 

Bon...on...n

Bác tư vấn miễn phí cho đoạn thay đổi tỉ lệ của hatch bằng lisp với. Mình làm qui hoạch 1 bản vẽ phải in ra 1 bản A0 và 1 bản A3. Nên cần thay đổi thèn này. Viết như sau nhưng ko hiểu sao ko cập nhật đc.

 

(defun c:sch (/ c e ss dtsc tlsc)

(command "undo" "be")

(setq tlsc (getreal "\nTi le phong : "))

(prompt "\nChon doi tuong muon chinh.")

(setq ss (ssget '((0 . "hatch"))))

(setq c 0)

(setq N (sslength ss))

(while (< c N)

(setq eT (ssname ss c))

(setq e (entget eT))

 

 

 

(setq dtsc (* (cdr (assoc 41 e)) tlsc))

(setq e (subst (cons 41 dtsc) (assoc 41 e) e))

(entmod e)

;(setq dl (fix (* (cdr (assoc 41 e)) tlsc)))

;(princ (strcat "\nti le: <" (itoa dl) ">"))

(setq c (1+ c))

)

(command "undo" "end")

(Princ)

)

 

Đoạn màu xanh là mình dùng kiểm tra xem biến dl có tồn tại ko thì kết quà là có nhưng lại ko cập nhật đ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ác tư vấn miễn phí cho đoạn thay đổi tỉ lệ của hatch bằng lisp với. Mình làm qui hoạch 1 bản vẽ phải in ra 1 bản A0 và 1 bản A3. Nên cần thay đổi thèn này. Viết như sau nhưng ko hiểu sao ko cập nhật đc.

 

(defun c:sch (/ c e ss dtsc tlsc)

(command "undo" "be")

(setq tlsc (getreal "\nTi le phong : "))

(prompt "\nChon doi tuong muon chinh.")

(setq ss (ssget '((0 . "hatch"))))

(setq c 0)

(setq N (sslength ss))

(while (< c N)

(setq eT (ssname ss c))

(setq e (entget eT))

(setq dtsc (* (cdr (assoc 41 e)) tlsc))

(setq e (subst (cons 41 dtsc) (assoc 41 e) e))

(entmod e)

;(setq dl (fix (* (cdr (assoc 41 e)) tlsc)))

;(princ (strcat "\nti le: <" (itoa dl) ">"))

(setq c (1+ c))

)

(command "undo" "end")

(Princ)

)

 

Đoạn màu xanh là mình dùng kiểm tra xem biến dl có tồn tại ko thì kết quà là có nhưng lại ko cập nhật đc.

 

duy782006 dùng thử LISP này (sử dụng hàm VLA-...)

(defun c:sch (/ c n objhatch ss tlsc)
 (vl-load-com)
 (command "undo" "be")
 (setq tlsc (getreal "\nTi le phong : "))
 (prompt "\nChon doi tuong muon chinh.")
 (setq ss (ssget '((0 . "hatch"))))
 (setq c 0)
 (setq N (sslength ss))
 (while (< c N)
   (setq objHatch (vlax-ename->vla-object (ssname ss c)))
   (vla-put-PatternScale objHatch tlsc)
   ;(vla-update objHatch)
   (setq c (1+ c)) )
 (command "undo" "end")
 (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

Đối với HATCH thì viết như bác xài hàm entmod thì nó không động đậy được

BÁc thử xài đoạn mã này xem nhé

(defun c:sch (/)
 (setvar "CMDECHO" 0)
 (command "undo" "be")
 (if (= tlsc nil)
   (setq tlsc1 2.00)
   (setq tlsc1 tlsc)
 )
 (setq
   tlsc (GETREAL (strcat "\nTi le ban ve: <" (rtos tlsc1 2 2) ">"))
 )
 (if (= tlsc nil)
   (setq tlsc tlsc1)
 )
 (prompt "\nChon doi tuong muon chinh.")
 (setq ss (ssget '((0 . "hatch"))))
 (setq c 0)
 (SETQ N (SSLENGTH SS))
 (while (< c N)
   (setq eT (ssname ss c))
   (setq e (entget eT))
   (setq dtsc (* (cdr (assoc 41 e)) tlsc))
   (command "hatchedit" et "p" "" dtsc "")
   (setq c (1+ c))
 )
 (command "undo" "end")
 (Princ)
)

 

Bon ... on ... n

  • 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
duy782006 dùng thử LISP này (sử dụng hàm VLA-...)

Vẫn đứng im bác ạ. Về lý thuyết đoạn của Duy viết cũng ko có sai nhưng ko hiểu sao lại ko đc thôi (đoạn tương tự với linetype scale thì chạy êm ru)

 

Đối với HATCH thì viết như bác xài hàm entmod thì nó không động đậy được

Bon ... on ... n

Ok rồi bác. Thank!

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

Lưu ý bác khi viết lisp nếu bác viết kiểu này

(defun c:sch (/ c e ss dtsc tlsc)

 

thì các biến sẽ mất khi chương trình kết thúc xong và khi chạy lần 2 thì nó sẽ không lưu biến tlsc khi chạy tiếp và khi đó mất công nhập lại.

  • Vote tăng 4

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 tư vấn miễn phí cho đoạn thay đổi tỉ lệ của hatch bằng lisp với. Mình làm qui hoạch 1 bản vẽ phải in ra 1 bản A0 và 1 bản A3. Nên cần thay đổi thèn này. Viết như sau nhưng ko hiểu sao ko cập nhật đc.

 

(defun c:sch (/ c e ss dtsc tlsc)

(command "undo" "be")

(setq tlsc (getreal "\nTi le phong : "))

(prompt "\nChon doi tuong muon chinh.")

(setq ss (ssget '((0 . "hatch"))))

(setq c 0)

(setq N (sslength ss))

(while (< c N)

(setq eT (ssname ss c))

(setq e (entget eT))

(setq dtsc (* (cdr (assoc 41 e)) tlsc))

(setq e (subst (cons 41 dtsc) (assoc 41 e) e))

(entmod e)

;(setq dl (fix (* (cdr (assoc 41 e)) tlsc)))

;(princ (strcat "\nti le: <" (itoa dl) ">"))

(setq c (1+ c))

)

(command "undo" "end")

(Princ)

)

 

Đoạn màu xanh là mình dùng kiểm tra xem biến dl có tồn tại ko thì kết quà là có nhưng lại ko cập nhật đc.

Chào bác Duy, thiep xin sửa giúp bác 1 chút cái lisp trên, đúng là đối tượng hatch không nên dùng hàm "entmod"

(defun c:sch (/ c eT ss tlsc N obj)
 (command "undo" "be")
 (setq tlsc (getreal "\nTi le phong : "))
 (prompt "\nChon doi tuong muon chinh.")
 (setq ss (ssget '((0 . "hatch"))))
 (setq c 0)
 (setq N (sslength ss))
 (while (< c N)
   (setq eT  (ssname ss c)
  obj (vlax-ename->vla-object eT)
   )
   (vla-put-PatternScale obj tlsc)
   (setq c (1+ c))
 )
 (vla-Evaluate obj)
 (vla-update obj)
 (command "undo" "end")
 (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ái này đối với Autolisp thì dễ hơn ăn ớt nữa

Nếu bạn có nhu cầu mình sẽ viết theo đơn đặt hàng của bạn bao gồm :

-Thiết kế trắc dọc+mặt bằng điện

- Tự động sắp xếp vô khung A3,A1,A0...

- Tự động in ấn các khổ giấy

- Tự động tiền chuyển vô tài khoản ... he he

 

Bon...on...n

Cảm ơn hảo ý của bác nhưng em muốn tự mình viết ra mới thú và có thể học đc nhìu hơn chứ nhờ người khác júp thì không còn ý nghĩa nữa. Em chỉ cần những lời gợi ý chân thành và những ý kiến júp đỡ mang tính xây dựng nền tảng rùi em sẽ tự xây dựng trên nền tảng đó. Theo như bác nói zạ là ý tưởng của em là hoàn toàn có thể rùi có fải hok!? Zạ thì em sẽ cố gắng tìm hỉu thêm để 1 ngày nào đó có thể đem khoe với các bác! :D

 

Rất cảm ơn mọi người và rất mong mọi người sẽ típ tục chỉ bảo dẫn dắt 1 con gà như em đi đúng hướng ạ!! :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
Cảm ơn hảo ý của bác nhưng em muốn tự mình viết ra mới thú và có thể học đc nhìu hơn chứ nhờ người khác júp thì không còn ý nghĩa nữa. Em chỉ cần những lời gợi ý chân thành và những ý kiến júp đỡ mang tính xây dựng nền tảng rùi em sẽ tự xây dựng trên nền tảng đó. Theo như bác nói zạ là ý tưởng của em là hoàn toàn có thể rùi có fải hok!? Zạ thì em sẽ cố gắng tìm hỉu thêm để 1 ngày nào đó có thể đem khoe với các bác! :D

 

Rất cảm ơn mọi người và rất mong mọi người sẽ típ tục chỉ bảo dẫn dắt 1 con gà như em đi đúng hướng ạ!! :D

Vậy thì bạn tìm hiểu từ từ nhé:

-Nâng cấp cái đoạn trên của bạn để chèn 2 block trudien vào 1 đầu mút góc quay theo hướng p1-p2 và ngoợc lại

 

(defun c:dpl()

(setq P1 (getpoint "cho diem dau: "))

(setq L (getstring 5"nhap chieu dai: "))

(setq G (getstring 5"nhap so goc: "))

(setq P2 (strcat "@" L "<" G))

(command "pline" P1 P2 "")

(command "pline" P1 P2 "")

(command ".INSERT" "trudien" p1 1 1 p2)

(command ".INSERT" "trudien" p2 1 1 p1)

 

(princ)

)

 

-Điều kiện trong bản vẽ đã tồn tại block trudien.

-Gải thích:

thực hiện lệnh insert tên block trudien, điểm chèn p1 tỉ lệ theo phương x =1, tỉ lệ theo phương y = 1. Góc chèn bằng p1 p2

  • 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

Muốn thay đổi block trudien bằng quá trình hoi đáp thì:

(command ".INSERT" tenblock p1 1 1 p2)

Và phía trên có thủ tục gán tenblock bằng cái gì thì tù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
Vậy thì bạn tìm hiểu từ từ nhé:

-Nâng cấp cái đoạn trên của bạn để chèn 2 block trudien vào 1 đầu mút góc quay theo hướng p1-p2 và ngoợc lại

 

(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 "")

(command "pline" P1 P2 "")

(command ".INSERT" "trudien" p1 1 1 p2)

(command ".INSERT" "trudien" p2 1 1 p1)

 

(princ)

)

 

-Điều kiện trong bản vẽ đã tồn tại block trudien.

-Gải thích:

thực hiện lệnh insert tên block trudien, điểm chèn p1 tỉ lệ theo phương x =1, tỉ lệ theo phương y = 1. Góc chèn bằng p1 p2

 

Cảm ơn Anh Duy wá trùi lun!!! Anh thật là tốt wá đã júp đỡ em thật nhiệt tình!! :D

Em xin anh júp em thêm tí nữa nhé (không bít sẽ hỏi anh bao nhiu lần nữa đây ^^!). Vấn đề là khi chèn block bằng command trong ACAD chúng ta sẽ có 1 hộp thoại Insert hiện lên và có cột tùy chọn Rotation để nhập vào số góc để xoay block. Cũng ý tương tự như vậy nhưng em không biết cú pháp lệnh để chèn block và cho nó xoay theo 1 góc bằng LISP. Anh có thể chỉ em được không anh?

 

Rất cảm ơn anh và chúc anh sức khỏe và thành đạt!!

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 Anh Duy wá trùi lun!!! Anh thật là tốt wá đã júp đỡ em thật nhiệt tình!! :D

Em xin anh júp em thêm tí nữa nhé (không bít sẽ hỏi anh bao nhiu lần nữa đây ^^!). Vấn đề là khi chèn block bằng command trong ACAD chúng ta sẽ có 1 hộp thoại Insert hiện lên và có cột tùy chọn Rotation để nhập vào số góc để xoay block. Cũng ý tương tự như vậy nhưng em không biết cú pháp lệnh để chèn block và cho nó xoay theo 1 góc bằng LISP. Anh có thể chỉ em được không anh?

 

Rất cảm ơn anh và chúc anh sức khỏe và thành đạt!!

Èo bạn chưa chạy thử đoạn trên à. Nó đã chèn và quay block rồi đó thôi. Chèn tại điểm p1 và quay theo góc p1 p2 rồi mà (đâu có hiện hộp thoại đâu). Còn muốn nhập góc thì

 

(command ".INSERT" "trudien" p1 1 1 goc)

 

À mình chỉnh bài trên 1 chút do đoạn ban đầu là lisp nguyên của bạn chưa sữa nên chạy bị lỗ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! Vì mình đang cần viết LISP để vẽ tự động mặt bằng tuyến lưới điện (mình đang làm khâu thiết kế trong ngành Điện). Mà 1 bản vẽ mặt bằng tuyến lưới điện yêu cầu không cần cao nhưng nếu vẽ bằng tay cũng mất khá nhìu thời gian cho nên mình muốn tự động hóa bằng cách chỉ cần nhập khoảng cách và hướng góc mà đường điện sẽ đi. Mình xin mô tả về bản vẽ mặt bằng tuyến lưới điện cơ bản của mình như sau:

 

- Lưới điện cần thể hiện gồm đường dây, trụ điện và các phụ kiện khác như: neo, tiếp địa...

- Đường dây sẽ được thể hiện bằng các đường PLine nối tiếp nhau. Khoảng cách giữa 2 điểm đầu và cuối của một đường PLine chính là khoảng cách giữa 2 trụ điện.

- Trên mỗi điểm đầu và điểm cuối sẽ bố trí lên đó 1 trụ điện và sẽ có thể có thêm neo hoặc tiếp địa.

 

Chỉ đơn giản là thế nhưng mình muốn viết LISP với ý tưởng như sau:

 

- Mình sẽ tạo một Menu Box để người dùng có thể tương tác nhập số liệu trên đó.

- Tạo các Block gồm: trụ điện, neo, tiếp địa...

- Người dùng sẽ nhập vào chiều dài đường dây và góc (để vẽ đường PLine như đã làm ở trên).

- Mỗi lúc vẽ 1 đường PLine, trong Menu Box sẽ có các List Box xổ xuống để người dùng lựa chọn sẽ đặt trụ điện, neo, tiếp địa... vào các điểm nút của mỗi đường PLine (CAD sẽ đặt các block như ta đã tạo ở trên vào các điểm đầu và cuối của đường PLine).

- Tiếp tục quay lại bước nhập vào chiếu dài đường dây và góc ở trên để vẽ tiếp 1 đường PLine nối tiếp vào điểm cuối của đường PLine vừa vẽ và thực hiện các bước tiếp theo cho đến khi giá trị chiều dài đường dây là NIL.

 

Không biết ý tưởng này của mình có khả thi không các Bác nhỉ?

Mình xin up lên hình chụp 1 bản vẽ về mặt bằng tuyến lưới điện mà mình thường vẽ để các Bác dễ hình dung. Trong hình các bác thấy đường dây đi thẳng vì mình chỉ chụp 1 góc bản vẽ thui nhưng thực tế thì đưòng dây sẽ có nhiều góc nữa.

 

THANK CÁC BÁC ĐÃ NHIỆT TÌNH JÚP ĐỠ EM RẤT NHÌU!!!

 

BANVEMAU.png

 

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

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 hảo ý của bác nhưng em muốn tự mình viết ra mới thú và có thể học đc nhìu hơn chứ nhờ người khác júp thì không còn ý nghĩa nữa. Em chỉ cần những lời gợi ý chân thành và những ý kiến júp đỡ mang tính xây dựng nền tảng rùi em sẽ tự xây dựng trên nền tảng đó. Theo như bác nói zạ là ý tưởng của em là hoàn toàn có thể rùi có fải hok!? Zạ thì em sẽ cố gắng tìm hỉu thêm để 1 ngày nào đó có thể đem khoe với các bác! :D

 

Rất cảm ơn mọi người và rất mong mọi người sẽ típ tục chỉ bảo dẫn dắt 1 con gà như em đi đúng hướng ạ!! :D

Hề hề hề,....

Chú gà này gáy hay ra phết nhẩy. Quả là chí lý, tự mình làm ra vẫn khoái hơn là đi mua về xài mà chả hiểu gì về nó. Nhỡ mua phải của không ngon thì ức lắm lắm. Rất mong chú gà này sẽ trở thành chú gà cồ trong làng Lisp nhẩy.....

Cái ý tưởng của bạn không phải là không chơi được. Tuy nhiên bạn cần cố gắng thêm chút nữa.

Lisp cho phép bạn sử dụng tất cả các lệnh của CAD với cú pháp (command tên lệnh tham số giá trị ......)

Tỷ như bác Duy đã cho bạn một cái lệnh Insert rồi đó. CHỉ có điều bạn cần lưu ý ở đây là mỗi lệnh sẽ sử dụng một hay nhiều tham số khác nhau y như trong CAD vậy, tên lệnh và tên tham số phải là chuỗi, còn giá trị tham số thì tùy từng tham số mà bạn phải nhập đúng thì nó mới chạy.

Về vấn đề này thì trăm hay không bằng tay quen, bạn cứ làm thử mỗi lệnh vài chục nhát là vỡ tung tóe ra ngay.

Việc nhớ các tham số này cũng là một vấn đề lôi thôi vì thường thì trí nhớ sẽ bị suy giảm dần, vậy nên cách tốt nhất là bạn chả cần nhớ gì cả, cứ nhớ các thao tác khi vẽ trong CAD ra sao thì nhập tham số theo như vậy. Còn tên tham số thì bạn cứ gõ lệnh CAD trên dòng command là nó sẽ hiện ra thôi.

Còn một điều nữa cần lưu ý là nếu lệnh chỉ dùng một loại tham số thì không cần nhập tên tham số (tỷ như lệnh line), còn nếu có nhiều tham số thì phải nhập theo đúng trình tự trong CAD kẻo Cad nó hiểu sai đi. Để kết thúc lệnh nếu trong CAD mình dùng enter thì trong lisp mình gõ "".

Ngoài ra trong lisp còn có lệnh pause để thoát khỏi lisp trả về mán hình Cad cho bạn nhập giá trị tham số từ màn hình bạn ạ.

Ấy là vài thứ mình mót được từ diễn đàn muốn trao đổi với bạn. Vì là của đi mót nên có thể nó chả ngon lắm nhưng cũng xài tàm tãm bạn ạ.

Hề hề hề,...

Chúc bạn vui khi tham gia diễn đàn.

  • 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

È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ẽ.

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
Èo bạn chưa chạy thử đoạn trên à. Nó đã chèn và quay block rồi đó thôi. Chèn tại điểm p1 và quay theo góc p1 p2 rồi mà (đâu có hiện hộp thoại đâu). Còn muốn nhập góc thì

 

(command ".INSERT" "trudien" p1 1 1 goc)

 

À mình chỉnh bài trên 1 chút do đoạn ban đầu là lisp nguyên của bạn chưa sữa nên chạy bị lỗi.

 

Uhm. Tại lúc hỏi anh là em chưa hiểu rõ cú pháp lệnh Insert của CAD viết trong LISP thế nào nên mới hỏi jờ thì nhờ bác nói rõ chỗ nhập góc em đã hiểu rùi.

Nhân đây các bác cho em hỏi mình có thể xem cú pháp lệnh CAD để viết trong LISP ở đâu không nhỉ? Vì cú pháp lệnh CAD khi viết trong LISP thì khác so với trong CAD. Em muốn hỏi để biết chỗ ngâm cứu và tự tìm hiểu. Nhiều khi như ở trên em muốn viết lệnh INSERT trong LISP thì không biết cú pháp nó chứa các phần tử nào cả nên cũng đơ lun.

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ú gà này gáy hay ra phết nhẩy. Quả là chí lý, tự mình làm ra vẫn khoái hơn là đi mua về xài mà chả hiểu gì về nó. Nhỡ mua phải của không ngon thì ức lắm lắm. Rất mong chú gà này sẽ trở thành chú gà cồ trong làng Lisp nhẩy.....

Cái ý tưởng của bạn không phải là không chơi được. Tuy nhiên bạn cần cố gắng thêm chút nữa.

Lisp cho phép bạn sử dụng tất cả các lệnh của CAD với cú pháp (command tên lệnh tham số giá trị ......)

Tỷ như bác Duy đã cho bạn một cái lệnh Insert rồi đó. CHỉ có điều bạn cần lưu ý ở đây là mỗi lệnh sẽ sử dụng một hay nhiều tham số khác nhau y như trong CAD vậy, tên lệnh và tên tham số phải là chuỗi, còn giá trị tham số thì tùy từng tham số mà bạn phải nhập đúng thì nó mới chạy.

Về vấn đề này thì trăm hay không bằng tay quen, bạn cứ làm thử mỗi lệnh vài chục nhát là vỡ tung tóe ra ngay.

Việc nhớ các tham số này cũng là một vấn đề lôi thôi vì thường thì trí nhớ sẽ bị suy giảm dần, vậy nên cách tốt nhất là bạn chả cần nhớ gì cả, cứ nhớ các thao tác khi vẽ trong CAD ra sao thì nhập tham số theo như vậy. Còn tên tham số thì bạn cứ gõ lệnh CAD trên dòng command là nó sẽ hiện ra thôi.

Còn một điều nữa cần lưu ý là nếu lệnh chỉ dùng một loại tham số thì không cần nhập tên tham số (tỷ như lệnh line), còn nếu có nhiều tham số thì phải nhập theo đúng trình tự trong CAD kẻo Cad nó hiểu sai đi. Để kết thúc lệnh nếu trong CAD mình dùng enter thì trong lisp mình gõ "".

Ngoài ra trong lisp còn có lệnh pause để thoát khỏi lisp trả về mán hình Cad cho bạn nhập giá trị tham số từ màn hình bạn ạ.

Ấy là vài thứ mình mót được từ diễn đàn muốn trao đổi với bạn. Vì là của đi mót nên có thể nó chả ngon lắm nhưng cũng xài tàm tãm bạn ạ.

Hề hề hề,...

Chúc bạn vui khi tham gia diễn đàn.

 

Rất cảm ơn các ý kiến của anh Bình. Em sẽ cố gắng nhìu hơn để không phụ lòng chỉ bảo của các bác. :D

 

Sẵn đây vì trong ý tưởng của em có mún tạo hộp thoại để người dùng tương tác nhập liệu dễ hơn nhưng em tìm mãi khôgn thấy tài liệu nào trên web hướng dẫn cụ thể về tạo hộp thoại cả. Nhất là em mún có 1 listbox (pulldown menu) trong hộp thoại để người dùng khi click vào sẽ xổ ra danh sách có các loại trụ điện và chọn 1 loại trụ điện (đã được tạo thành các block riêng cho từng loại trụ điện (trên lưới điện sẽ có các loại trụ điện cao 8m 12m 14m...)) sau đó sẽ thực thi đoạn LISP insert loại trụ điện (block trụ điện) mà người dùng đã chọn trong danh sách vào điểm nút của đường dây như cách mà bác Duy đã chỉ.

 

Bác nào bít về vụ DIALOG này xin júp em cái. Chứ tìm hỉu VBA thì mất nhìu thời jan wá mà quỹ thời jan của em thì lại có hạn (8h dành cho nhà nước rùi). Rất cảm ơn các bác đã wan tâm và đóng góp ý kiến cho em.

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
Uhm. Tại lúc hỏi anh là em chưa hiểu rõ cú pháp lệnh Insert của CAD viết trong LISP thế nào nên mới hỏi jờ thì nhờ bác nói rõ chỗ nhập góc em đã hiểu rùi.

Nhân đây các bác cho em hỏi mình có thể xem cú pháp lệnh CAD để viết trong LISP ở đâu không nhỉ? Vì cú pháp lệnh CAD khi viết trong LISP thì khác so với trong CAD. Em muốn hỏi để biết chỗ ngâm cứu và tự tìm hiểu. Nhiều khi như ở trên em muốn viết lệnh INSERT trong LISP thì không biết cú pháp nó chứa các phần tử nào cả nên cũng đơ lun.

 

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)

  • 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

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

×