Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
trinhhoanghieu090

[Lisp] Nhờ giúp đỡ

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

Chào các lisper!

 

Em là dân ngoại đạo, mong các bác chỉ giáo. Sau một hồi mày mò chán chê thành quả của em mới chỉ được như thế này:

 

(defun c:ves2()
(setq tt  (getfiled "\n Please Choose Symbol DWG File : (.dwg)" "C:\\PGS\\" "dwg" 2))
(setq dtau (getpoint "\n Pick Symbol Position:") huong (getreal "\n Please Enter Vessel scale:") )
(command "insert" tt dtau huong "" "0")
)

 

Lisp này mới chỉ chèn được ký hiệu vào một vị trí pick duy nhất. Mong các bác giúp em sửa lisp làm sao cho mình có thể pick được nhiều điểm liên tiếp để chèn ký hiệu vào.

 

Cảm ơn các bác nhiều.

 

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


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

Bạn dùng vòng lặp while, muốn dứt lệnh thì enter.

 

(defun c:ves2()
  (setq tt  (getfiled "\n Please Choose Symbol DWG File : (.dwg)" "C:\\PGS\\" "dwg" 2))
  (while (setq dtau (getpoint "\n Pick Symbol Position:")
      huong (getreal "\n Please Enter Vessel scale:") )
    (command "insert" tt dtau huong "" "0"))
)

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

Thanks a Tot77 nhiều nhé. Nhờ bác chỉ giáo thêm chút nữa. Như lisp vừa sửa thì vẫn phải nhập đi nhập lại tỷ lệ scale. Em muốn chỉ pick nhiều điểm liên tục và chỉ nhập giá trị scale một lần duy nhất thì sửa như thế nào ạ.

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


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

Mình đã thử và thành công. thanks nhoclangbat


(defun c:ves2()
  (setq tt  (getfiled "\n Please Choose Symbol DWG File : (.dwg)" "C:\\PGS\\" "dwg" 2))
  (setq huong (getreal "\n Please Enter Vessel scale:"))
  (while (setq dtau (getpoint "\n Pick Symbol Position:")
       )
    (command "insert" tt dtau huong "" "0"))
)

 

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 xem hộ em với sao khi em làm thế này mà nó toàn lỗi không nhận hướng hả bác tot77:

(defun c:PS2()
(setq dtau (getpoint "\n Pick Vessel Position:") huong (getreal "\n Please Enter Vessel Heading:") huong (- huong))
(command "insert"(strcat"*" "PS") dtau "1""" huong)
)

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ông biết bạn dùng cad nào, chứ cad 10 lệnh insert nó khác, chỉ có thế này.

(command "insert" (strcat "*" "PS") dtau 1 huong)

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ũng đang dùng cad 2010, tại vì hôm nay là ngày đầu tiên tập tành làm "lisper" nên không biết bác ạ. Em đang cố mò để làm cái lisp tại topic: http://www.cadviet.com/forum/topic/112330-nha-viazt-lisp-va-sca-aea-thal-neo-tau-biafn/ . Ý tưởng thì cũng có rồi đấy nhưng lực bất tòng tâm. Bác có thể ghé qua giúp em tí được không.

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


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

Các bro giúp em viết một đoạn lisp này với:

Đầu tiên chỉnh chế độ góc của autocad theo chế độ clockwise:

133631_hinh_1.jpg

 

- Nhập góc gh.

- 2 góc gt, gs trên cùng một dòng: (vií dụ gt,gs)

 

Nếu gh nhỏ hơn hoặc bằng 180, tính các góc ga, gc theo công thức:

 

ga= gh+180 + gs/2

 

gc=gh+180 - gs/2

 

Nếu gh lớn hơn 180, tính các góc ga, gc theo công thức:

 

ga= gh-180 + gs/2

 

gc=gh-180 - gs/2

 

Trong cả 2 trường hợp trên các góc gb, gd đều tính theo công thức:

 

gb= gh-gt/2

 

gd= gh+gt/2

 

Nếu ga,gb, gc, gd nhỏ hơn 0 thì cộng với 360 độ.

chỉnh chế độ góc về mặc định, kết thúc lisp:133631_hinh_2.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

Quick code :

(defun c:abcxyz()
(setvar 'angdir 1)
(setq 	gh (getreal "\ngh :") f (if (<= gh 180) + -))
(mapcar 'set '(gt gs) 
	(read (strcat "(" (getstring t "\ngt gs (cach nhau boi space) :") ")"))
)
(setq 	ga (+ (f gh 180) (* gs 0.5))
		gc (- (f gh 180) (* gs 0.5))
		gb (- gh (* gt 0.5))
		gd (+ gh (* gt 0.5))
)
(setvar 'angdir 0)
)

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

Nếu tính các trường hợp như thế thì sao gọi là quick code bác ơi. Bao sân cả các units type thì mệt 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

@Ket: user nhập góc là độ_phút_giây?

 

 

Nếu tính các trường hợp như thế thì sao gọi là quick code bác ơi. Bao sân cả các units type thì mệt lắm :)

 

Bác ketxu để  góc nhập ở đây là góc thập phân là đúng cái em cầ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

Sau một hồi mày mò và được sự giúp đỡ của các bác @phamthanhbinh, @ketxu, @tot77 đây là tác phẩm đầu tay của em :

 

(defun c:PS2()

(setvar 'angdir 1)

;;;==============================================
;;; ve tau
;;;==============================================

(setq gh (getreal "\n Please Enter Vessel Heading <0d>:") )
(if (= gh nil) (setq gh 0 ))

(setq dtau (getpoint "\n Pick Vessel Position:"))
(command "insert" (strcat"*""PS") dtau 1 gh)


;;; ve day neo
;;;==============================================
;;; nhap so lieu neo truoc lai, sau lai
;;;===============================================
(mapcar 'set '(gt lt)
    (read (strcat "(" (getstring t "\n Nhap Goc Mo & Chieu Dai Day Neo Truoc Lai(cach nhau boi space) :") ")"))
)
(mapcar 'set '(gs ls)
    (read (strcat "(" (getstring t "\n Nhap Goc Mo & Chieu Dai Day Neo Sau Lai(cach nhau boi space) :") ")"))
)
(setq     ga (+ (+ gh 180) (* gs 0.5))
    gc (- (+ gh 180) (* gs 0.5))
    gb (- gh (* gt 0.5))
    gd (+ gh (* gt 0.5))
)
(setq   ga (- ga 90) ga(- ga)
        gb (- gb 90) gb(- gb)
        gc (- gc 90) gc(- gc)
        gd (- gd 90) gd(- gd)
)
(if (< ga 0) (setq ga (+ ga 360)))
(if (< gb 0) (setq gb (+ gb 360)))
(if (< gc 0) (setq gc (+ gc 360)))
(if (< gd 0) (setq gd (+ gd 360)))

(if (>= ga 360) (setq ga (- ga 360)))
(if (>= gb 360) (setq gb (- gb 360)))
(if (>= gc 360) (setq gc (- gc 360)))
(if (>= gd 360) (setq gd (- gd 360)))

;;; Ve day neo bang toa do cuc
;;;===============================================

(command "line" "non" (setq pb (getpoint "\nChon diem Neo AP2: ")) "non" (polar pb (/ (* pi gb) 180) lt) "")
(command "line" "non" (setq pd (getpoint "\nChon diem Neo AS4: ")) "non" (polar pd (/ (* pi gd) 180) lt) "")
(command "line" "non" (setq pa (getpoint "\nChon diem Neo AP1: ")) "non" (polar pa (/ (* pi ga) 180) ls) "")
(command "line" "non" (setq pc (getpoint "\nChon diem Neo AS3: ")) "non" (polar pc (/ (* pi gc) 180) ls) "")

)

http://www.cadviet.com/upfiles/3/133631_ps.dwg

 

Các bác xem, sửa lại cho gọn và thêm cho em một số chức năng sau đây vào lisp với:

 

-  Đoạn code này :

(mapcar 'set '(gt lt)
(read (strcat "(" (getstring t "\n Nhap Goc Mo & Chieu Dai Day Neo Truoc Lai(cach nhau boi space) :") ")"))

Các bác sửa lại cho các giá trị nhập vào cách nhau vào dấu phẩy và bấm dấu cách (space bar) là thực hiện tiếp

- Tất cả các đối tượng này được vẽ từ lệnh lisp vào layer "Anchor_Pattern" . Nếu chưa có thì tạo mới, có rồi thì add luôn vào.

- Viết các giá trị góc và cạnh trên đường thẳng vừa vẽ bằng tọa độc cực, ví dụ:

(command "line" "non" (setq pb (getpoint "\nChon diem Neo AP2: ")) "non" (polar pb (/ (* pi gb) 180) lt) "")

 

thì viết giá trị gb, lt lên cạnh đó với chiều cao text high mặc định. file kết quả như ví dụ:

http://www.cadviet.com/upfiles/3/133631_mau_3.dwg

 

 

 

 

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

Đăng nhập để thực hiện theo  

×