Đế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

#221 duyanhhcm

duyanhhcm

    biết vẽ arc

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

Đã gửi 13 June 2010 - 01:00 AM

- Mình cũng đã tự làm được một số ứng dụng hỗ trợ công việc. Xin góp một tẹo với diễn đàn.
- Sách: mình chỉ dùng 2 tập của tác giả Nguyễn Hữu Lộc Tp.HCM
- Tham khảo: Help, một số Web về từng chủ đề như: Dialog, Menu ....
- Ý tưởng: hầu hết xuất phát từ thực tế mình vấp phải. Ngày nào cũng phải làm mà làm đi làm lại nó cay cú lắm, tại sao không lập cho "máy vi tính" nó chạy.
- Ngoài ra, diễn đàn Cadviet.com đã cung cấp hầu hết các ý tưởng cho mình. Chỉ có điều trên diễn đàn chỉ đủ không gian nêu được vấn đề, hoặc cách xử lý cơ bản. Còn để một ứng dụng "sống" được, mình cần thể hiện một cách quy củ hơn. Đặc biệt khâu trình bày, khâu ktra lỗi, khâu xuất nhập ra file...
- Mình thừa nhận DuyLisp của mình có nhái lại một số ý tưởng (như một số bạn đã "lói"). Nếu bạn chạy bản Full, sẽ thấy nó hơn hẳn về cấp độ so với những lisp nhỏ lẻ được post trên diễn đàn. Mình chỉ nhái lại ý tưởng thôi, còn code gần như ko sử dụng. Mình nghĩ diễn đàn không phải là nơi mình có thể xin đầy đủ 100% tài liệu. Đây là ngôi nhà chung giúp bạn khai thông các bế tắc, để từ đó có kiến thức tối thiểu để đọc sách, để vun đắp cho "đứa con" của mình. Dù gì, bạn phải đặt được cái tôi trong chương trình mình làm ra.
- Mình thấy cách hướng dẫn qua file "Relax" của bác ssg mang ý tưởng rất tổng thể. Cho anh em một cái nhìn tổng quan về Lisp. Cách này có ích cho cả những người đã tập tành lisp như chúng tôi. Mong bác phát huy nhiều hơn nữa.
Dạo này đi công trường nhiều wá, không thăm hỏi được anh em. Cho gửi lời chào đến anh em và ban quản trị nhé !
  • 0
DU KHONG TIM THAY PHUOC, IT RA THAY HOA MA TRANH DI...

#222 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 14 June 2010 - 07:14 AM

Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!

(DEFUN c:ve4diem ( )
(setq a (getpoint "\nChon diem 1: "))
(setq b (getpoint a"\nChon diem 2: "))
(setq ct (getpoint b"\nChon diem 3: "))
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(setq daiab (distance a b))
(setq gocab (angle b a))

(setq gocbct (angle b ct))
(setq daibct (distance b ct))

(setq gocchenhlech (- gocbct gocab))

(Cond
((< gocab gocbct)
(setq goclech (+ (- gocbct gocab) (/ pi 2)))
)
((> gocab gocbct)
(setq goclech (- (- gocbct gocab) (/ pi 2)))
)
)

(setq goctinhra (- gocbct goclech))
(setq c (polar b goctinhra daibct))
(setq d (polar c gocab daiab))

(command "pline" a b c d a "")

(setvar "osmode" luubatdiem)
(princ)
)
  • 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


#223 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 14 June 2010 - 08:14 AM

Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!

(DEFUN c:ve4diem ( )
(setq a (getpoint "\nChon diem 1: "))
(setq b (getpoint a"\nChon diem 2: "))
(setq ct (getpoint b"\nChon diem 3: "))
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(setq daiab (distance a :cheers:)
(setq gocab (angle b a))

(setq gocbct (angle b ct))
(setq daibct (distance b ct))

(setq gocchenhlech (- gocbct gocab))

(Cond
((< gocab gocbct)
(setq goclech (+ (- gocbct gocab) (/ pi 2)))
)
((> gocab gocbct)
(setq goclech (- (- gocbct gocab) (/ pi 2)))
)
)

(setq goctinhra (- gocbct goclech))
(setq c (polar b goctinhra daibct))
(setq d (polar c gocab daiab))

(command "pline" a b c d a "")

(setvar "osmode" luubatdiem)
(princ)
)

Vấn đề của bạn có thể đuợc hiểu như sau :
Từ điểm B trên đuờng thẳng AB, tìm điểm C sao cho :
- CB vuông góc với BA
- CB có độ dài cho truớc
- C gần với 1 điểm C' cho truớc.


sẽ có 2 điểm C1 và C2 thõa điều kiện :
- CB vuông góc với BA
- CB có độ dài cho truớc
C1 và C2 đối xứng nhau qua đ/t AB

(setq C1 (polar b (+ gocab (/ pi 2)) daibct))
(setq C2 (polar b (- gocab (/ pi 2)) daibct))


So sánh khoảng cách giữa điểm C1 và C2 đến điểm C' cho truớc, tìm đuợc kết quả.
(if (< (distance ct C1) (distance ct C2))
(setq c C1)
(setq c C2))


Code của bạn :
(DEFUN c:ve4diem ()
(setq a (getpoint "\nChon diem 1: "))
(setq b (getpoint a "\nChon diem 2: "))
(setq ct (getpoint b "\nChon diem 3: "))
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(setq daiab (distance a b ))
(setq gocab (angle b a))

(setq gocbct (angle b ct))
(setq daibct (distance b ct))

(setq c1 (polar b (+ gocab (/ pi 2)) daibct)
c2 (polar b (- gocab (/ pi 2)) daibct))
(if (< (distance ct c1) (distance ct c2))
(setq c c1)
(setq c c2))

(setq d (polar c gocab daiab))

(command "pline" a b c d a "")

(setvar "osmode" luubatdiem)
(princ)
)

  • 1

#224 ndtnv

ndtnv

    biết lệnh divide

  • Members
  • PipPipPipPipPipPip
  • 440 Bài viết
Điểm đánh giá: 391 (khá)

Đã gửi 15 June 2010 - 04:33 PM

Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!
...

Trước đây mình cũng có viết một hàm vẽ HCN với yêu cầu khác của bạn một chút.
Bạn có thể tham khảo để thấy được kết quả trong khi chọn điểm thứ ba.
(defun RectangPts (p1 p2 rp3 rp4 / a )
(setq a (angle p1 p2))
(set rp4 (inters p1 (polar p1 (+ a (/ pi 2)) 100) (eval rp3) (polar (eval rp3) a 100) nil))
(set rp3 (polar (eval rp4) a (distance p1 p2)))
)

(defun C:RotateRectang (/ n p1 p2 p3 p4 a grdat om)
(setq p1 (getpoint "\nPoint 1:") p2 (getpoint p1 "\nPoint 2:") a (angle p1 p2))
(while (/= 3 n)
(setq grdat (grread t 7 0) n (car grdat) p3 (cadr grdat))
(if (eq 5 n)
(progn
(redraw)(RectangPts p1 p2 'p3 'p4 )
(grvecs (list -7 p1 p2 p2 p3 p3 p4 p4 p1) )
) )
)
(setq om (getvar "osmode"))
(setvar "osmode" 0)
(redraw)(RectangPts p1 p2 'p3 'p4 )
(command "PLINE" p1 p2 p3 p4 "c" )
(setvar "osmode" om)
)

  • 0

#225 quangtvxd

quangtvxd

    biết zoom

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

Đã gửi 17 June 2010 - 03:46 PM

Mình có một vấn đề cần hỏi: làm sao tắt mở được chế độ "osnap" trong auto lisp để khi chạy lệnh lisp không bị bắt điểm lung tung, cám ơn.
  • 0

#226 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 913 Bài viết
Điểm đánh giá: 512 (tốt)

Đã gửi 18 June 2010 - 02:01 AM

Mình có một vấn đề cần hỏi: làm sao tắt mở được chế độ "osnap" trong auto lisp để khi chạy lệnh lisp không bị bắt điểm lung tung, cám ơn.

Không đâu xa cả, bạn tham khảo lisp ngay phía trên bài viết của bạn đi. biến OSMODE
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#227 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 913 Bài viết
Điểm đánh giá: 512 (tốt)

Đã gửi 25 June 2010 - 04:56 PM

Làm thế nào để ta lấy được tọa độ các đỉnh trung gian và điểm cuối của 1 Leader
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#228 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 25 June 2010 - 08:56 PM

Làm thế nào để ta lấy được tọa độ các đỉnh trung gian và điểm cuối của 1 Leader

1- Bạn lọc lấy DXF 10 trong data của nó là xong ngay.
2- Xin chia sẻ một chút kinh nghiệm "vọc" lisp của ssg. Không riêng gì leader, mà với bất cứ đối tượng nào, ssg có sẵn 1 "lá bùa" vẫn load thường trực:

(defun C:EG( )
(setq e (car (entsel)))
(textscr)
(setq d (entget e))
)

Đối chiếu kết quả d nhận được với object bạn sẽ tự nghiệm ra bản chất vấn đề. Hiểu được rồi thì xử lý là chuyện nhỏ! Hy vọng kinh nghiệm nho nhỏ trên sẽ giúp được chút gì đó cho bạn.

Brazil-Portugal ra sân rồi, chào bạn!
  • 1

#229 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 913 Bài viết
Điểm đánh giá: 512 (tốt)

Đã gửi 26 June 2010 - 09:28 AM

1- Bạn lọc lấy DXF 10 trong data của nó là xong ngay.
2- Xin chia sẻ một chút kinh nghiệm "vọc" lisp của ssg. Không riêng gì leader, mà với bất cứ đối tượng nào, ssg có sẵn 1 "lá bùa" vẫn load thường trực:

(defun C:EG( )
(setq e (car (entsel)))
(textscr)
(setq d (entget e))
)

Đối chiếu kết quả d nhận được với object bạn sẽ tự nghiệm ra bản chất vấn đề. Hiểu được rồi thì xử lý là chuyện nhỏ! Hy vọng kinh nghiệm nho nhỏ trên sẽ giúp được chút gì đó cho bạn.

Brazil-Portugal ra sân rồi, chào bạn!


Em cũng viết 1 "lá bùa" cho mình. hehe, sai lầm chết người của em chính từ "lá bùa lởm" này :s_big:

(defun c:tra (/ KQ i E)
(setq E (entsel) i -3)
(while (< i 500)
(setq KQ (cdr (assoc i (entget (car E)))))
(if KQ (progn
(prompt (strcat "\n"(rtos i 2 0) " - "))
(princ KQ)
))
(setq i (1+ i))
)
(textscr) (princ)
);end

Cảm ơn anh nhé :cheers:
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#230 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 24 July 2010 - 10:54 PM

Thank you
  • 0

#231 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 10 August 2010 - 02:08 AM

Mình sd cú pháp (setq ss (ssget)) để chọn một số đối tượng , trong đó có một số block tên "truranh"
Nếu mình muốn lọc tập hợp các block "truranh" trên (trong biến ss) ra một biến khác thì làm thế nào.
Mình đã thử làm như sau nhưng kg đc, các bạn chỉ giúp. Cám ơn
(setq ss (ssget))
(command "_.select" ss "")
(setq ss1 (ssget "p" '((0 . "insert") (2 . "truranh"))))
  • 0

#232 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 10 August 2010 - 02:59 AM

Mình sd cú pháp (setq ss (ssget)) để chọn một số đối tượng , trong đó có một số block tên "truranh"
Nếu mình muốn lọc tập hợp các block "truranh" trên (trong biến ss) ra một biến khác thì làm thế nào.
Mình đã thử làm như sau nhưng kg đc, các bạn chỉ giúp. Cám ơn
(setq ss (ssget))
(command "_.select" ss "")
(setq ss1 (ssget "p" '((0 . "insert") (2 . "truranh"))))

Mình nghỉ bạn làm như vậy là đúng rồi
  • 0

#233 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 913 Bài viết
Điểm đánh giá: 512 (tốt)

Đã gửi 10 August 2010 - 06:53 PM

Mình sd cú pháp (setq ss (ssget)) để chọn một số đối tượng , trong đó có một số block tên "truranh"
Nếu mình muốn lọc tập hợp các block "truranh" trên (trong biến ss) ra một biến khác thì làm thế nào.
Mình đã thử làm như sau nhưng kg đc, các bạn chỉ giúp. Cám ơn
(setq ss (ssget))
(command "_.select" ss "")
(setq ss1 (ssget "p" '((0 . "insert") (2 . "truranh"))))

có thể block đó của bạn là block động. tên của block động sẽ thay đổi khi bạn thay đổi trạng thái của nó.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#234 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 12 August 2010 - 04:20 PM

Mình hatch 1 vùng, sau đó muốn đo diện tích vùng đó nhưng ko muốn pick lại vùng đó giống như khi hatch. Bạn nào giúp mình viết 1 lisp sao cho chỉ cần chọn phần hatch thì sẽ xuất ra diện tích của hatch đó (ra text có sẵn). Thanks :(
  • 0

#235 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 835 (rất tốt)

Đã gửi 12 August 2010 - 05:36 PM

Mình hatch 1 vùng, sau đó muốn đo diện tích vùng đó nhưng ko muốn pick lại vùng đó giống như khi hatch. Bạn nào giúp mình viết 1 lisp sao cho chỉ cần chọn phần hatch thì sẽ xuất ra diện tích của hatch đó (ra text có sẵn). Thanks :(

Theo em ko cần dùng lisp cho tốn công nhớ lệnh ra.
Anh cứ chọn phần đã hát rồi gõ lệnh LI xem có thấy diện tích ko?

Command: h HATCH
Pick internal point or [Select objects/remove Boundaries]: Selecting
everything...
Selecting everything visible...
Analyzing the selected data...

Analyzing internal islands...

Pick internal point or [Select objects/remove Boundaries]:
Command:
Command: li LIST 1 found

HATCH Layer: "0"
Space: Model space
Handle = 185
Hatch pattern ANSI31
Annotative: No
Hatch scale 1.0000
Hatch angle 0
Associative
Area 69.2689
Origin X= 0.0000 Y= 0.0000 Z= 0.0000
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#236 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 12 August 2010 - 08:53 PM

Ah, dùng lệnh Li thì mất công xem rồi ghi lại vào text, nếu dùng lisp đo dt pick lại điểm thì lâu quá vì đã có sẵn phần hatch đó rồi. Mình có đến gần 200 cái hatch như vậy nên làm sẽ mất thời gian lắm :( , cái mình muốn là nó tự động ghi diện tích vào text có sẵn, bạn nào giúp minh với nhé!
  • 0

#237 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 835 (rất tốt)

Đã gửi 12 August 2010 - 09:32 PM

Ah, dùng lệnh Li thì mất công xem rồi ghi lại vào text, nếu dùng lisp đo dt pick lại điểm thì lâu quá vì đã có sẵn phần hatch đó rồi. Mình có đến gần 200 cái hatch như vậy nên làm sẽ mất thời gian lắm :( , cái mình muốn là nó tự động ghi diện tích vào text có sẵn, bạn nào giúp minh với nhé!

http://www.cadviet.c...o...12432&st=40
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#238 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 13 August 2010 - 09:30 AM

Không được bạn ơi, dùng lisp trên gần như là pick vào 1 vùng --- khoanh vùng đó - xuất ra dt

Cái mình muốn là nhấn vào hatch có sẵn và xuất ra giá trị diện tích :(
  • 0

#239 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 13 August 2010 - 10:29 AM

Không được bạn ơi, dùng lisp trên gần như là pick vào 1 vùng --- khoanh vùng đó - xuất ra dt

Cái mình muốn là nhấn vào hatch có sẵn và xuất ra giá trị diện tích :(


Sài tạm cái này nè:
;=============================
(defun c:vd(/ dt p1)
(princ "\nPick Hatch tinh dientich: ")
(command "area" "OB" pause)
(setq dt (rtos (getvar "area") 2 2))
(setq p1 (getpoint "\nCHon diem dat Text: "))
(entmake (list (cons 0 "TEXT") (cons 1 dt) (cons 10 p1) (cons 40 5.0)))
(princ)
)
;=============================


Hay cái này (dùng cái này nhé, cái trên tham khảo cho zui!)

(defun c:vd(/ dt p1 ht)
(vl-load-com)
(setq dt (vlax-ename->vla-object (car(entsel "\nPick doi tuong tinh dien tich: ")))
dt (vlax-get-property dt 'Area)
dt (rtos dt 2 2)
)
(setq ht (getdist "\nCho vao co chu: "))
(if (not ht)(setq ht 5))

(setq p1 (getpoint "\nCHon diem dat Text: "))
(entmake (list (cons 0 "TEXT") (cons 1 dt) (cons 10 p1) (cons 40 ht)))
(princ)
)


;=============================

ZuiZÚi
  • 0
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......

#240 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 13 August 2010 - 11:32 AM

Lisp chạy rất tốt, thanks bạn nhé. Bạn giúp mình thêm 1 chút nữa đc ko, thay vì pick chọn vị trí text rồi ghi text vào thì bây h đổi lại là chọn 1 text đã có sẵn, ghi diện tích vào text có sẵn đó ^^'
  • 0