Đến nội dung


Hình ảnh
- - - - -

[Lisp] Nhờ giúp đỡ


  • Please log in to reply
21 replies to this topic

#1 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 09:10 AM

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.

 


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 23 October 2014 - 10:04 AM

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

  • 0

#3 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 10:09 AM

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 ạ.


  • 0

#4 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 23 October 2014 - 10:27 AM

hi đưa biến scale lên trên khỏi while ^^
  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#5 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 10:48 AM

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

 


  • 0

#6 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 04:15 PM

Các bác ơi trường hợp mình muốn phá cái block sau khi insert ở trên ra thì sửa lại lisp như thế nào.


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 23 October 2014 - 04:29 PM

Bạn đặt thêm dấu * trước tên block

(command "insert" (strcat "*" tt)  dtau huong "" "0"))


  • 0

#8 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 05:06 PM

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


  • 0

#9 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 23 October 2014 - 07:26 PM

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)


  • 0

#10 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 23 October 2014 - 08:47 PM

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.c...-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.


  • 0

#11 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 24 October 2014 - 08:04 AM

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


  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 24 October 2014 - 08:38 AM

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

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 24 October 2014 - 09:01 AM

Thanks bác ketxu nhiều nhé.


  • 0

#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5450 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 24 October 2014 - 09:17 AM

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


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#15 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 24 October 2014 - 09:29 AM

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


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#16 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 24 October 2014 - 10:12 AM

Các bác giúp em viết thêm đoạn lisp này với:
Vẽ đoạn thẳng theo tọa độ cực với biến góc ga và biến chiều dài la,điểm bắt đầu đoạn thẳng pick từ màn hình.
  • 0

#17 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5450 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 24 October 2014 - 10:16 AM

Này thôi:

(command "line" "non" (setq p1 (getpoint "\nChon diem goc: ")) "non" (polar p1 (/ (* pi ga) 180) la) "") 


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#18 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 24 October 2014 - 10:17 AM

@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. :)


  • 0

#19 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 24 October 2014 - 10:18 AM

Này thôi:

(command "line" "non" (setq p1 (getpoint "\nChon diem goc: ")) "non" (polar p1 (/ (* pi ga) 180) la) "") 

Thanks bác.


  • 0

#20 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 25 October 2014 - 11:01 AM

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.c...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.c...33631_mau_3.dwg

 

 

 

 


  • 0