Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
* * * - - 3 Bình chọn

Hướng dẫn lập trình Lisp


  • Please log in to reply
493 replies to this topic

#201 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 05 April 2010 - 05:42 PM

Cám ơn các Bác.
PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.
Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.
http://www.cadviet.c...mat_luoi_3d.dwg

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)

Xin bác Tue_nv sửa thêm lisp vẽ phân giác để cho phép User chỉ cần select 3 điểm P0, Px, Py và input chiều dài line X.
(defun c:VPG (/ oldos prdiem ssa p ent prd prc pd pc eL dhuong hs
diem listdiem listdp xmin xmax ymin ymax)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 3)
(setvar "cmdecho" 0)
(setvar "edgemode" 1)
(setq ssa (ssadd) i 0 listdiem (list) listdp (list))
(while (setq p (getpoint "\n Chon trung diem doan bo goc :") )
(while (or (null (nentselp p))
(not (wcmatch (cdr(assoc 0 (entget(car (nentselp p))))) "*LINE,ARC"))
)
(setq p (getpoint "\n Chon trung diem doan bo goc :")))
(setq ent (car(nentselp p)))
(setq prdiem (vlax-curve-getParamAtPoint ent p))
(setq prd (- prdiem 0.5) prc (+ prdiem 0.5))
(if (or (= prdiem 0) (= prdiem (vlax-curve-getEndParam ent)) )
(progn
(setq prd 0.5)
(setq prc (- (vlax-curve-getEndParam ent) 0.5))
) )
;;;;;;
(setq pd (vlax-curve-getPointAtParam ent prd)
pc (vlax-curve-getPointAtParam ent prc) )
(setvar "osmode" 0)
(command "Xline" "B" p pd pc "") (setq eL (entlast))
(setq dhuong (cdr(assoc 11 (entget (entlast)))))
(setq hs (distance pd pc))
(setq diem (list (+ (car p) (* (car dhuong) hs))
(+ (cadr p) (* (cadr dhuong) hs)) 0))
(command "line" p diem "")
(setq ssa (ssadd (entlast) ssa))
(entdel eL)
(setq listdiem (append listdiem (list diem)))
(setq listdp (append listdp (list p)))
(setvar "osmode" 3)
);while
(setq xmin (- (caar(vl-sort listdp '(lambda (x1 x2)
(< (car x1) (car x2)) ) ))
hs))
(setq xmax (+ (caar(vl-sort listdp '(lambda (x1 x2)
(> (car x1) (car x2)) ) ))
hs))
(setq ymin (- (cadar(vl-sort listdp '(lambda (x1 x2)
(< (cadr x1) (cadr x2)) ) ))
hs))
(setq ymax (+ (cadar(vl-sort listdp '(lambda (x1 x2)
(> (cadr x1) (cadr x2)) ) ))
hs))
(vla-zoomwindow (vlax-get-acad-object)
(vlax-3d-point (list xmin ymin 0))
(vlax-3d-point (list xmax ymax 0)) )
(command "extend" ssa "" "F")
(foreach x listdiem (command x))
(command "" "")
(setvar "osmode" oldos)
(setvar "modemacro" "Chuc ban lam viec hieu qua - Tue_NV-0955193619")
)

  • 0

#202 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4320 Bài viết
Điểm đánh giá: 3823 (đỉnh cao)

Đã gửi 05 April 2010 - 07:10 PM

Cám ơn các Bác.
PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.
Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.
http://www.cadviet.c...mat_luoi_3d.dwg

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)

Xin bác Tue_nv sửa thêm lisp vẽ phân giác để cho phép User chỉ cần select 3 điểm P0, Px, Py và input chiều dài line X

Chào Phiphi. Lisp trên là Tue_NV viết cho bạn svba1608. Lisp thực hiện chỉ khi User pick từng trung điểm của đoạn bo góc hay đó là giao điểm của 2 phân đoạn PLINE tạo nên góc. Vì bài toán của svba là bài toán bất kì. Nó chẳng tuân theo 1 quy luật nào cả, cho nên mới viết như vậy. Còn nếu các đa tuyến tạo theo 1 quy luật nhất định thì khi thực hiện Lisp sẽ nhanh hơn, cũng chẳng cần select 3 điểm P0, Px, Py như của Phiphi nói mà Lisp tự động chọn cho mình và thực thi luôn

input chiều dài line X : cái này Phiphi nói chưa hiểu. Thế nào là input chiều dài line X?
chiều dài line X là chiều dài // trục X chăng? Nó không // trục Ox được không?
Phiphi nên rút kinh nghiệm là mình nên nói 1 cách rõ ràng hơn. và mình nghĩ bài toán này bạn nên post vào topic "Viết Lisp theo yêu cầu" thì thích hợp hơn đó.
  • 0

#203 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 05 April 2010 - 09:26 PM

Chào Phiphi. Lisp trên là Tue_NV viết cho bạn svba1608. Lisp thực hiện chỉ khi User pick từng trung điểm của đoạn bo góc hay đó là giao điểm của 2 phân đoạn PLINE tạo nên góc. Vì bài toán của svba là bài toán bất kì. Nó chẳng tuân theo 1 quy luật nào cả, cho nên mới viết như vậy. Còn nếu các đa tuyến tạo theo 1 quy luật nhất định thì khi thực hiện Lisp sẽ nhanh hơn, cũng chẳng cần select 3 điểm P0, Px, Py như của Phiphi nói mà Lisp tự động chọn cho mình và thực thi luôn

input chiều dài line X : cái này Phiphi nói chưa hiểu. Thế nào là input chiều dài line X?
chiều dài line X là chiều dài // trục X chăng? Nó không // trục Ox được không?
Phiphi nên rút kinh nghiệm là mình nên nói 1 cách rõ ràng hơn. và mình nghĩ bài toán này bạn nên post vào topic "Viết Lisp theo yêu cầu" thì thích hợp hơn đó.

Xin lổi bác Tue_nv nhé.
Ý PP là vẽ 1 đường phân giác có chiều dài = X. Đây là đoạn phân giác của 2 line P0,Px và P0,Py được tạo bởi 3 điểm P0, Px và Py.
Trong bản vẽ PP đã post trên, đó là các đoạn 300 và 100 của 4 góc dùng để căng tấm lưới Hyper shape.
  • 0

#204 duong-we

duong-we

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 09 April 2010 - 03:09 PM

Tại so minh không thể down load được tai lieu hoc Lisp, hệ thống báo là concurrent hits exceeded, bac nao co co the gui vao mail giup minh duoc khong:
My mail: duongnguyenwe@gmail.com
Best regard!
  • 0

#205 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 13 April 2010 - 12:33 AM

Các bạn hướng dẫn giúp mình cách gởi một text vào hộp soạn thảo kiểu edit text và sau khi chính sửa lấy nội dung chúng ra một biến. Xin cám ơn
  • 0

#206 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2159 Bài viết
Điểm đánh giá: 1368 (rất tốt)

Đã gửi 13 April 2010 - 07:06 AM

Các bạn hướng dẫn giúp mình cách gởi một text vào hộp soạn thảo kiểu edit text và sau khi chính sửa lấy nội dung chúng ra một biến. Xin cám ơn



Trong khi chờ đợi có người giải thích thì bạn tải file Này về xem cách mình viết có giúp được vấn đề của bạn không! để hiểu thêm về tác dụng của lệnh bạn xem chủ đề :
http://www.cadviet.c...o...near&start=
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#207 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 13 April 2010 - 11:26 AM

Trong khi chờ đợi có người giải thích thì bạn tải file Này về xem cách mình viết có giúp được vấn đề của bạn không! để hiểu thêm về tác dụng của lệnh bạn xem chủ đề :
http://www.cadviet.c...o...near&start=

Cám ơn bạn. Nhưng có cách nào sd edit box có sẵn của Cad mà kg phải viết DCL kg
  • 0

#208 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 15 April 2010 - 07:24 PM

Các bạn cho mình hỏi tý. Trong lisp, làm thế nào để khởi động Wipeout. Vì tạo file có dùng Wipeout để khi insert ra cho nó che cái đối tượng nó đè lên, nhưng nếu chưa gọi lệnh Wipeout thì nó chẳng thấy gì. Các bạn chỉ giúp mình nhé. Cám ơn
  • 0

#209 dr.quan

dr.quan

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 April 2010 - 11:30 PM

anh ssg ơi anh cho em yahoo của anh đi hì!
  • 0

#210 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 16 April 2010 - 11:29 AM

Các bạn cho mình hỏi tý. Trong lisp, làm thế nào để khởi động Wipeout. Vì tạo file có dùng Wipeout để khi insert ra cho nó che cái đối tượng nó đè lên, nhưng nếu chưa gọi lệnh Wipeout thì nó chẳng thấy gì. Các bạn chỉ giúp mình nhé. Cám ơn

Không thấy ai trả lời cả. Nhân vừa mới tìm ra nên đưa các bạn tham khảo vậy.
Đối với BV, nếu bạn chưa gọi lệnh Wipeout thì khi insert block có sd wipeout, nó sẽ kg thấy gì. Để khởi động wipeout, bạn cho câu lệnh sau vào lisp
(IF (= (TYPE C:WIPEOUT) 'SUBR) (arxload "wipeout"))
Ghi chú : file wipeout.arx phải có trong đường dẫn cad
  • 0

#211 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 16 April 2010 - 12:14 PM

anh ssg ơi anh cho em yahoo của anh đi hì!

Chào bạn!
Theo ssg hiểu là bạn muốn trao đổi riêng với ssg về một số vấn đề gì đó? Ssg cũng thường nhận được một số tin nhắn với nội dung tương tự như vậy. Trong đa số các trường hợp, ssg đã có câu trả lời chung như thế này:
Mọi vấn đề, nếu không mang tính cá nhân riêng tư, bạn hãy post công khai trên diễn đàn, sẽ có rất nhiều người quan tâm đến vấn đề bạn nêu và cùng nhau trao đổi, chia sẻ, học hỏi lẫn nhau. Điều đó có ích hơn gấp ngàn lần việc trao đổi riêng giữa 2 người. CADVIET phát triển được như hôm nay một phần cũng là nhờ tinh thần cộng đồng ấy.
Mong rằng bạn, cũng như một số bạn đã từng gởi tin nhắn riêng với ý muốn trao đổi chuyên môn hiểu cho.
Chúc bạn vui khi tham gia diễn đàn.
  • 2

#212 quangtvxd

quangtvxd

    biết zoom

  • Members
  • Pip
  • 18 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 17 April 2010 - 04:37 PM

Chào các bác, ai giúp mình viết đoạn lisp có thể thay đổi các giá trị trong BLOCK có thuộc tính rồi các giá trị khác trong BLOCK đó thay đổi theo một công thức nào đó, Ví dụ như file thống kê thép sau: http://www.cadviet.c...pfiles/2/00.dwg , khi thay đổi chiều dài thì tổng chiều dài, trọng lượng cũng thay đổi theo. Cám ơn nhiều....
  • 0

#213 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 17 April 2010 - 07:52 PM

Cám ơn các Bác.
PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.
Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.
http://www.cadviet.c...mat_luoi_3d.dwg

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)
...

PP vừa viết thử đoạn code dưới đây dùng để vẽ mặt lưới như bản vẽ post như trên.
Nhờ các Bác check và bổ sung để vẽ được như bản vẽ mẫu 3D trên.
Cám ơn nhiều.
;Lenh VML (Ve Mat Luoi) Phiphi- Cadviet.com
;===============================================

(defun C:VML (/ p1 p2 p3 p4 Edge1 Edge2 Edge3 Edge4)
(vl-load-com)

(setq col (getvar "cecolor"))
(setq OLDSNAP (getvar "OSMODE") ;store system variables
OLDBLIP (getvar "BLIPMODE")
OLDLIGHT (getvar "HIGHLIGHT")
);setq
;===============================================
(setvar "CMDECHO" 0) ;change system variables
(setvar "BLIPMODE" 0)
(setvar "OSMODE" 0)
(command "Undo" "Begin")
(command "ucs" "World")

(Setq
p1(getpoint "\n Diem goc P1: ")
p2(getpoint "\n Diem P2: ")
p3(getpoint "\n Diem P3: ")
p4(getpoint "\n Diem P4: "))

(command "layer" "m" "S_edge1" "C" "4" "" "")
;(command "ucs" "3" p2 p3 p1)

(vl-cmdf "_arc" p2 "E" p1 "A" "-25")
(setq Edge1 (entlast))
(vl-cmdf "_arc" p2 "E" p3 "A" "25")
(setq Edge2 (entlast))

(command "layer" "m" "S_edge2" "C" "5" "" "")
;(command "ucs" "3" p4 p1 p3)

(vl-cmdf "_arc" p4 "E" p3 "A" "-25")
(setq Edge3 (entlast))
(vl-cmdf "_arc" p4 "E" p1 "A" "25")
(setq Edge4 (entlast))

(command "layer" "m" "S_sail" "C" "41" "" "")
(command "_edgesurf" Edge1 Edge2 Edge3 Edge4 "")
(setq sail (entlast))

;(command "MOVE" sail "" P1 P3)
(command "ucs" "World")

;===============================================
(setvar "cecolor" col)
(setvar "OSMODE" OLDSNAP) ;reset system variables
(setvar "BLIPMODE" OLDBLIP)
(setvar "HIGHLIGHT" OLDLIGHT)
(princ) ;exit quietly
(prompt"\nDone\n")
(command "Undo" "End")
);defun
(prompt "\n Lenh VML (Ve Mat Luoi) ")

  • 0

#214 quangtvxd

quangtvxd

    biết zoom

  • Members
  • Pip
  • 18 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 25 May 2010 - 10:20 AM

Tự tay mình lập một chương trình Lisp có gì khác so với nhờ ai đó làm? Chưa cần xét kết quả, điểm khác nhau rất cơ bản là bạn sẽ có được cái cảm giác rất là khoái chí (không thể diễn tả) khi chạy thử chương trình.
Ssg lập topic này không ngoài mục đích tạo điều kiện cho các bạn tự mình tìm hiểu và khám phá cái cảm giác "khoái chí không thể diễn tả" nói trên.
Với tinh thần "Share is Receive", ssg cũng mong các bạn đã thành thạo Lisp quan tâm giúp đỡ các bạn mới để cộng đồng Lisp của CadViet ngày càng đông vui và tạo được nhiều chương trình hữu ích.
Để bắt đầu, ssg post lại một bài viết cũ, nhưng có lẽ vẫn còn mới đối với một số bạn. Hy vọng sẽ giúp được chút gì đó cho các bạn mới tiếp cận với Lisp:

http://www.cadviet.c...les/Relax_1.zip

Download, giải nén rồi đọc file *.doc

Bài viết của bạn "ssg" hay quá , bạn có thể tiếp tục thêm vài bài viết khác để anh em có thể học hỏi được không, chứ đọc sách thì khó hiểu hơn bạn viết nhiều.
  • 0

#215 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4320 Bài viết
Điểm đánh giá: 3823 (đỉnh cao)

Đã gửi 04 June 2010 - 09:15 AM

Không hiểu tại sao trong bản vẽ này không sử dụng các method : explode; getboundingbox đối với Block thuộc tính được.
Block này có tên là coc d600
Khi sử dụng method explode thì CAD lại báo lỗi này :
; error: Automation Error. Invalid input

Còn khi sử dụng method getboundingbox thì không thể tìm được các điểm max, min được

Tại sao vậy nhỉ? Trong khi các bản vẽ khác lại sử dụng được?

Đây là Bản vẽ : http://www.mediafire.com/?t2zyyclkzjt

Nguyên nhân tại sao vậy nhỉ???
Tue_NV không biết vì cớ làm sao?
Rất mong nhận được sự giúp đỡ của các bác.
Tue_NV xin cảm ơn.
  • 0

#216 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1446 Bài viết
Điểm đánh giá: 1434 (rất tốt)

Đã gửi 04 June 2010 - 02:59 PM

Không hiểu tại sao trong bản vẽ này không sử dụng các method : explode; getboundingbox đối với Block thuộc tính được.
Block này có tên là coc d600
Khi sử dụng method explode thì CAD lại báo lỗi này :
; error: Automation Error. Invalid input

Còn khi sử dụng method getboundingbox thì không thể tìm được các điểm max, min được

Tại sao vậy nhỉ? Trong khi các bản vẽ khác lại sử dụng được?

Đây là Bản vẽ : http://www.mediafire.com/?t2zyyclkzjt

Nguyên nhân tại sao vậy nhỉ???
Tue_NV không biết vì cớ làm sao?
Rất mong nhận được sự giúp đỡ của các bác.
Tue_NV xin cảm ơn.

Tue_NV sài phiên bản CAD nào ?
Test trên CAD 2008, mọi chuyện bình thường.
  • 0

#217 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 June 2010 - 01:53 AM

Khi sd lệnh insert với hộp thoại, ta dễ dàng chèn một file cùng tên vào để thay thế block có sẵn trong bản vẽ. Nhưng ở chế độ dòng lệnh, lệnh insert mặc định dùng block có trên bản vẽ mà kg dùng file mặc dù ta đã đánh đầy đủ đường dẫn đến file cần thiết.
Làm thế nào viết một lisp sd lệnh insert (không dùng hộp thoại) để chèn một file vào thay thế một block cùng tên đã có trong bản vẽ. Xin các bạn hướng dẫn. Cám ơn
  • 0

#218 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 June 2010 - 02:35 PM

Khi sd lệnh insert với hộp thoại, ta dễ dàng chèn một file cùng tên vào để thay thế block có sẵn trong bản vẽ. Nhưng ở chế độ dòng lệnh, lệnh insert mặc định dùng block có trên bản vẽ mà kg dùng file mặc dù ta đã đánh đầy đủ đường dẫn đến file cần thiết.
Làm thế nào viết một lisp sd lệnh insert (không dùng hộp thoại) để chèn một file vào thay thế một block cùng tên đã có trong bản vẽ. Xin các bạn hướng dẫn. Cám ơn

Chào bác Trungngamy,
Bác xài thử code này xem có đúng ý bác không nhé:
(command "insert" "~")
Chúc bác vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#219 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 June 2010 - 02:45 PM

Chào bác Trungngamy,
Bác xài thử code này xem có đúng ý bác không nhé:
(command "insert" "~")
Chúc bác vui.

Cám ơn bạn. Mình thử rồi, kg đc bạn ạ, khi gặp "~" nó mở hộp thoại.

Mình đã tự làm đc rồi. Để thay một file khác thành block đã có. Làm như sau
(command "_.insert" "tenblockcu=tenfilemoi" ^C)
Tenfilemoi có thể khác tenblockcu và phải có trong thư mục hiện hành hoặc trong các đường dẫn cad hoặc đầy đủ đường dẫn
Mình đưa lên để các bạn tham khảo chơi. Có thể sẽ có cách khác
  • 1

#220 quangtvxd

quangtvxd

    biết zoom

  • Members
  • Pip
  • 18 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 12 June 2010 - 05:22 PM

http://www.cadviet.c...les/Relax_1.zip

Download, giải nén rồi đọc file *.doc
[/quote]

Xin hỏi: SS+Entity và Database có nghĩa là gì vậy.
  • 0