Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Trong khi vẽ, đôi khi ta chọn đối tượng trước rồi mới gõ lệnh và cad hiểu những đối tượng vừa chọn đó là để phục vụ cho lệnh vừa nhập. VD: khi muốn xóa một đối tượng nào đó, ta có thể chọn đối tượng trước hoặc sau khi gõ lênh erase. Vậy muốn làm việc này với lisp thì ta phải viết như thế nào?

Cụ thể với lisp sử dụng hàm SSGET ngay đầu lisp để chọn đối tượng muốn xử lý.

đây là một ví dụ để có thể chọn đối tượng trước khi dùng lệnh. Chú ý tới hàm ssgetfirst

	
(setq SSet (cadr (ssgetfirst)))
 (if (null SSet)
(setq SSet (ssget)
 )
)

  • 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

em kiếm trên diển đàn có 2 lisp sau:

http://www.cadviet.com/upfiles/2/pla.lsp

http://www.cadviet.com/upfiles/2/tla.lsp

các lisp chạy rất tốt...em muốn kết hợp 2 lisp trên thành 1 lisp (thực hiện các công việc giống 2 lisp đó)

mong các anh giúp đở..em cám ơn :s_big:

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ề,

Khổ quá, văn dốt vũ dát nên làm khổ các bác,

Là thế này ạ:

Mình đang làm việc với bản vẽ A đang mở, dùng lisp để sử lý một số cái linh tinh trong đó, khổ nỗi nó lại có dình dáng ít nhiều tới bản vẽ B nên phải mở nó ra để sử lý rốt ráo. Sau khi sử lý xong trên cái bản vẽ B thì đóng nó lại và quay trở về bản vẽ A để chạy nốt phần còn lại của lisp.

Trước nay mình toàn phải mở thằng B ra sử lý trước rồi mới chạy lisp trên bản vẽ A. Bây giờ mình muốn chèn thêm một đoạn lisp vào cái lisp cũ để nó làm hộ mình cái việc này (mở bản vẽ B ra trong khi lisp đang chạy và sử lý sau đó đóng nó lại). Thế nhưng loay hoay hoài mà chả mở được các bác ạ.

Mình đã thử xài lệnh open trong lisp nhưng không được các bác ạ.

Khổ thế nên mới định hỏi thăm các bác xem có cách nào chơi được nó không , để căn bệnh lười của mình nó thêm nặng ý mà.

Thanks các bác đã quan tâm.

Bạn thử làm theo cách sau:

1. Tạo 1 file rỗng (VD a.lsp) rồi cho vào danh sách tự động load

2. Ghi nội dung các lệnh lisp cần thực hiện vào file a.lsp

- Nếu các lệnh là không đổi, cho vào file b.lsp, trước khi chạy copy sang file a.lsp

3. Mở file dwg, các lệnh trong a.lsp sẽ tự động thực hiện

4. Close file dwg

5. Xóa nội dung trong a.lsp

 

Sau đây là VD cho trường hợp lệnh không thay đổi

(vì là VD nên chưa xử lý trường hợp có lỗi)

VD trong file b.lsp có lệnh vẽ sau:

(entmake '((0 . "CIRCLE") (10 0 0) (40 . 100.0)))

Hàm sau sẽ open file a.dwg trong folder của bản vẽ đang mở, vẽ vòng tròn đk 100

(vl-load-com)
(defun C:TestRun ( / f s ac docs doc)
(vl-file-delete "C:/a.lsp")
(vl-file-copy "C:/b.lsp" "C:/a.lsp")
(setq ac (vlax-get-acad-object))
(setq docs (vlax-get-property ac 'Documents))
(setq s (strcat (getvar "DWGPREFIX") "a.dwg"))
(setq doc (vlax-invoke-method docs "Open" s))
(vlax-invoke-method doc "Close" "True")
(setq f (open "C:/a.lsp" "w"))
(close f)
)

  • 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
Trong khi vẽ, đôi khi ta chọn đối tượng trước rồi mới gõ lệnh và cad hiểu những đối tượng vừa chọn đó là để phục vụ cho lệnh vừa nhập. VD: khi muốn xóa một đối tượng nào đó, ta có thể chọn đối tượng trước hoặc sau khi gõ lênh erase. Vậy muốn làm việc này với lisp thì ta phải viết như thế nào?

Cụ thể với lisp sử dụng hàm SSGET ngay đầu lisp để chọn đối tượng muốn xử lý.

Chào Thaistreetz và Nataca,

Hàm SSGET với sel-method là "I" sẽ chọn các đối tượng do người dùng chọn trước khi phát lệnh. Đây là 1 mã ví dụ:

(defun c:ssI (/ ss p1 p2)
 (setq ss (ssget "I"))
 (if (null ss)
   (alert
     "\nban chua chon doi tuong truoc \nhoac da chon truoc \nnhung chua trung doi tuong nao"
   )
   (progn
     (setq p1 (getvar "lastpoint"))
     (setq p2 (ACET-SS-DRAG-MOVE ss p1 "di chuyên cac doi tuong vua chon dên diêm:" 0))
     (command ".move" ss "" p1 p2)
   )
 )
 (princ)
)

Hãy chú ý hàm ACET-SS-DRAG-MOVE, rất có ích cho các bạn đó.

Thaistreetz ứng dụng hàm này vào lisp GHI TOA DO CAC DIEM VA THONG KE THANH BANG xem!

  • Vote tăng 3

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ãy chú ý hàm ACET-SS-DRAG-MOVE, rất có ích cho các bạn đó.
Cảm ơn Tuệ, Thiep bận rộn cả ngày hôm qua, Tuệ đã tiếp tay rất nhanh cho Tuynh.

Thiep chỉ gợi ý Tue rằng có 1 hàm trong thư viện Express tools tạo POLYLINE rất nhanh, đó là: acet-pline-make.

Còn lisp trên, Tuynh hãy đợi Tue_NV sẽ thêm vòng lặp để chọn đối tượng đến khi enter thì thôi

Chào bạn thiep

Bạn có thể chỉ cho mình cấu trúc và cú pháp của ACET-SS-DRAG-MOVE ở đâu không?

 

Cả hàm acet-pline-make mà Thiep đã viết cho Tuynh nữa. Mình tìm hoài trong thư viện Express tools mà chẳng thấy

acet-pline-make đâu.

Cảm ơn Thiep 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
Chào bạn thiep

Bạn có thể chỉ cho mình cấu trúc và cú pháp của ACET-SS-DRAG-MOVE ở đâu không?

 

Cả hàm acet-pline-make mà Thiep đã viết cho Tuynh nữa. Mình tìm hoài trong thư viện Express tools mà chẳng thấy

acet-pline-make đâu.

Cảm ơn Thiep rất nhiều

Chào Tue_NV,

Các hàm này nằm trong các lisp của Express, ví dụ acet-pline-make nằm trong extrim.lsp, mời bạn qua đây:

http://www.cadviet.com/forum/index.php?s=&...ost&p=73330

Thiep sẽ giới thiệu hết 1 số hàm trong thư viện Express tools mà thiep sưu tầm được và sẽ chia sẻ với các bạn.

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
Chào Thaistreetz và Nataca,

Hàm SSGET với sel-method là "I" sẽ chọn các đối tượng do người dùng chọn trước khi phát lệnh. Đây là 1 mã ví dụ:

(defun c:ssI (/ ss p1 p2)
 (setq ss (ssget "I"))
 (if (null ss)
   (alert
     "\nban chua chon doi tuong truoc \nhoac da chon truoc \nnhung chua trung doi tuong nao"
   )
   (progn
     (setq p1 (getvar "lastpoint"))
     (setq p2 (ACET-SS-DRAG-MOVE ss p1 "di chuyên cac doi tuong vua chon dên diêm:" 0))
     (command ".move" ss "" p1 p2)
   )
 )
 (princ)
)

Hãy chú ý hàm ACET-SS-DRAG-MOVE, rất có ích cho các bạn đó.

Thaistreetz ứng dụng hàm này vào lisp GHI TOA DO CAC DIEM VA THONG KE THANH BANG xem!

ACET-SS-DRAG-MOVE Rất hay anh Thiệp ạ. Nó cho ta một cái nhìn rất trực quan về kết quả trước khi vẽ. Bản thân em cũng nhiều lần tự hỏi vì sao một số chương trình làm được điều này. Thanks anh nhiều :s_big:

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 anh, các chị cho em hỏi:

Làm sao có thể tạo 1 tập chọn chứa các đối tượng của nhiều bản vẽ (file)?

Xử lý, cập nhật các đối tượng này có như bình thường không?

Tks!!!

 

Hôm nay! Cả nhà đi vắng à!

Ngày mai (20/09/2009) mấy anh chị di cafe xong về chỉ em nha!

 

23/09/2009: topic này bị bỏ hoang rồi sao?????????? :cheers:

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 anh, các chị cho em hỏi:

trong lisp co câu lệnh ssadd

Hàm (ssadd...)

Chức năng: Thêm một đối tượng vào tập đối tượng

 

(ssadd [ename] [ss])

 

Thế nhưng em vẫn ko hiểu nhờ các bác chỉ bảo hộ cái. Thanhkou 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
Các anh, các chị cho em hỏi:

trong lisp co câu lệnh ssadd

Hàm (ssadd...)

Chức năng: Thêm một đối tượng vào tập đối tượng

 

(ssadd [ename] [ss])

 

Thế nhưng em vẫn ko hiểu nhờ các bác chỉ bảo hộ cái. Thanhkou nhiều

Bạn tham khảo ví dụ duới đây.

(defun c:test ()
 (setq ss (ssadd) lstName (list))
 (while (setq sel (entsel "\nChon doi tuong them vao tap hop SS : "))
   (setq obj (car sel))
   (if (= (type obj) 'ENAME)
     (progn
(ssadd obj ss)
(princ (strcat "\n\tDa them 1 "(cdr (assoc 0 (entget obj))) " vao tap hop SS"))
)
     )
   )
 (princ (strcat "\nTap hop SS co " (itoa (sslength ss)) " doi tuong."))
 (foreach obj (mapcar 'cadr (ssnamex ss))
   (if (setq sl (assoc (setq name (cdr (assoc 0 (entget obj)))) lstName))
     (setq lstName (subst (list name (1+ (nth 1 sl))) (assoc name lstName) lstName ) )
     (setq lstName (cons (list name 1) lstName)) )    )
 (if lstName
   (progn
     (princ "\n\tTrong do co : ")
   (foreach name lstName
     (princ (strcat  "\n\t\t - "(itoa (cadr name)) " : " (car name)))
     )
   )
 )
 (princ)
 )

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
uh...cái này mình cũng ko hiểu..mong các bạn chỉ giúp..

Chào bạn polarisvn,

Nó đây bạn, cái này mình trích trong Help của Cad, bạn xem thử nhé

 

ssadd Function

 

Adds an object (entity) to a selection set, or creates a new selection set

 

(ssadd [ename [ss]])

 

Arguments

 

ename

 

An entity name.

 

ss

 

A selection set.

 

If called with no arguments, ssadd constructs a new selection set with no members. If called with the single entity name argument ename, ssadd constructs a new selection set containing that single entity. If called with an entity name and the selection set ss, ssadd adds the named entity to the selection set.

 

Return Values

 

The new or modified selection set.

 

Examples

 

When adding an entity to a set, the new entity is added to the existing set, and the set passed as ss is returned as the result. Thus, if the set is assigned to other variables, they also reflect the addition. If the named entity is already in the set, the ssadd operation is ignored and no error is reported.

 

Set e1 to the name of the first entity in drawing:

 

Command: (setq e1 (entnext))

 

 

Set ss to a null selection set:

 

Command: (setq ss (ssadd))

 

 

The following command adds the e1 entity to the selection set referenced by ss:

 

Command: (ssadd e1 ss)

 

 

Get the entity following e1:

 

Command: (setq e2 (entnext e1))

 

 

Add e2 to the ss entity:

 

Command: (ssadd e2 ss)

 

 

Đại ý cái này nói là:

Hàm ssadd được dùng để thêm một đối tượng vào một tập chọn, hay là tạo ra một tập chọn mới.

Cú pháp của nó:

(ssadd ename [ss])

Trong đó

ename là tên của đối tượng được thêm vào ( cái tên này phải lấy theo tên mà cad đã định nghĩa cho đối tượng trong bản vẽ, nó có thể là kết quả từ các hàm lựa chọn đối tượng như entsel, entlast, .... hay hàm ssname, ....)

ss là tập chọn các đối tượng đã được xác định trước để gán thêm đối tượng mới vào.

Nếu hàm ssadd được gọi không có các đối số kèm theo tức là (ssadd) thì nó sẽ tạo ra một tập chọn mới mà chả có ma nào trong đó cả.

Giá trị trả về của hàm ssadd là một tập chọn mới hay một tập chọn đã được chỉnh sửa.

 

Bạn hãy xem thêm các vì dụ sẽ rõ về cách sử dụng hàm ssadd này bạn ạ.

Chúc bạn thành cô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 anh, các chị cho em hỏi:

Làm sao có thể tạo 1 tập chọn chứa các đối tượng của nhiều bản vẽ (file)?

Xử lý, cập nhật các đối tượng này có như bình thường không?

.............

Chào master_worse

Một cách chung chung thì LISP không thể tạo 1 tập chọn chứa các đối tượng của nhiều bản vẽ.

Tuy nhiên với những t/hợp cụ thể, kết hợp với VBA hay Script (ScriptPro) thì có thể giải quyết đuợc.

VD :

- in tất cả các file đang open trong CAD hiện hành (và chưa open).

- duyệt qua tất cả các file thực hiện cùng 1 tổ hợp lệnh (zoom Extents, purge, save, close ...)

  • 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

Mình sưu tầm được Lisp lập bảng tọa độ góc ranh.

nay mình muốm thêm vào dòng chữ bên dưới chữ BẢNG TỌA ĐỘ GÓC RANH với dòng chữ : Hệ toạ độ VN-2000

Mong được chỉ chỉ giúp :

 

;;;HEADER

(setvar "CLAYER" "bangtd")

(linepx p0 (* 32 h))

(command "copy" "L" "" "m" p00 p01 p02 "")

(linepy p0 (- (distance p0 p02)))

(command "copy" "L" "" "m" p0

(list (+ (car p0) (* 4 h)) (cadr p0))

(list (+ (car p0) (* 14 h)) (cadr p0))

(list (+ (car p0) (* 24 h)) (cadr p0))

(list (+ (car p0) (* 32 h)) (cadr p0))

"")

(setq Lkqua nil)

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH"

(polar (polar p0 0 (* 16 h)) (* 0.5 pi) (* 2 h))

(* 1.2 h) nil)

 

(txt1 (setq Lkq (list "TT" "X (m)" "Y (m)" "S (m)")))

(setq Lkqua (append Lkqua (list Lkq)))

(setq p0 (polar p0 (* 1.5 pi) (* 3 h)))

-------------------------------------

Mình phải chỉnh vào đâu ?

mẫu link sau :

http://www.cadviet.com/upfiles/2/bang_he_td_vn2000.rar

Cám ơn

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 sưu tầm được Lisp lập bảng tọa độ góc ranh.

nay mình muốm thêm vào dòng chữ bên dưới chữ BẢNG TỌA ĐỘ GÓC RANH với dòng chữ : Hệ toạ độ VN-2000

Mong được chỉ chỉ giúp :

 

;;;HEADER

(setvar "CLAYER" "bangtd")

(linepx p0 (* 32 h))

(command "copy" "L" "" "m" p00 p01 p02 "")

(linepy p0 (- (distance p0 p02)))

(command "copy" "L" "" "m" p0

(list (+ (car p0) (* 4 h)) (cadr p0))

(list (+ (car p0) (* 14 h)) (cadr p0))

(list (+ (car p0) (* 24 h)) (cadr p0))

(list (+ (car p0) (* 32 h)) (cadr p0))

"")

(setq Lkqua nil)

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH"

(polar (polar p0 0 (* 16 h)) (* 0.5 pi) (* 2 h))

(* 1.2 h) nil)

 

(txt1 (setq Lkq (list "TT" "X (m)" "Y (m)" "S (m)")))

(setq Lkqua (append Lkqua (list Lkq)))

(setq p0 (polar p0 (* 1.5 pi) (* 3 h)))

-------------------------------------

Mình phải chỉnh vào đâu ?

mẫu link sau :

http://www.cadviet.com/upfiles/2/bang_he_td_vn2000.rar

Cám ơn

 

Bạn thử sửa

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH"

thành

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH\nHệ toạ độ VN-2000"

Xem

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 thử sửa

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH"

thành

(wtxtMC "BAÛNG TOÏA ÑOÄ GOÙC RANH\nHệ toạ độ VN-2000"

Xem

Ra kết qủa, nhưng cùng 1 hàng.

Mình muốn cho ra 2 hàng.Phải làm sao ?

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

Nhờ các anh hướng dẫn về nội dung của những dỏng lệnh này, khi muốn thay đổi về mẫu khung ta phải làm thế nào.

 

---------------------------------------------------

(setq pt0 (getpoint "\n Hay chon diem dat bang toa do")

k (getreal "\n Hay nhap chieu cao dong: ")

pt1 (list (- (car pt0) 80) (cadr pt0))

pt2 (list (car pt1) (+ (cadr pt1) (* (+ i 3) k)))

pt3 (list (car pt0) (cadr pt2))

pt4 (polar pt0 pi 65)

pt5 (polar pt0 pi 40)

pt6 (polar pt0 pi 15)

pt7 (polar pt4 (/ pi 2) (* (+ i 3) k))

pt8 (polar pt5 (/ pi 2) (* (+ i 2) k))

pt9 (polar pt6 (/ pi 2) (* (+ i 3) k))

p10 (polar pt7 (- (/ pi 2)) k)

p11 (polar pt9 (- (/ pi 2)) k)

p12 (polar pt2 (- (/ pi 2)) (* k 2))

p13 (polar p12 0 80))

(command "line" pt0 pt1 pt2 pt3 "c")

(command "line" pt4 pt7 "")

(command "line" pt5 pt8 "")

(command "line" pt6 pt9 "")

(command "line" p10 p11 "")

(command "line" p12 p13 "")

(command "text" (list (+ (car pt2) 2) (+ (cadr pt2) 2)) 3 0 "BANG LIET KE TOA DO GOC RANH")

(command "text" (list (+ (car pt2) 2.5) (- (cadr pt2) 4)) 2 0 "So hieu")

(command "text" (list (+ (car pt2) 4) (- (cadr pt2) 8)) 2 0 "diem")

(command "text" (list (+ (car pt7) 20) (- (cadr pt7) 4)) 2 0 "Toa do")

(command "text" (list (+ (car pt7) 10) (- (cadr pt7) 8)) 2 0 "X(m)")

(command "text" (list (+ (car pt7) 35) (- (cadr pt7) 8)) 2 0 "Y(m)")

(command "text" (list (+ (car pt9) 4) (- (cadr pt9) 6)) 2 0 "Canh")

----------------------------------

Rất cám ơn

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
Nhờ các anh hướng dẫn về nội dung của những dỏng lệnh này, khi muốn thay đổi về mẫu khung ta phải làm thế nào.

 

---------------------------------------------------

(setq pt0 (getpoint "\n Hay chon diem dat bang toa do")

k (getreal "\n Hay nhap chieu cao dong: ")

pt1 (list (- (car pt0) 80) (cadr pt0))

pt2 (list (car pt1) (+ (cadr pt1) (* (+ i 3) k)))

pt3 (list (car pt0) (cadr pt2))

pt4 (polar pt0 pi 65)

pt5 (polar pt0 pi 40)

pt6 (polar pt0 pi 15)

pt7 (polar pt4 (/ pi 2) (* (+ i 3) k))

pt8 (polar pt5 (/ pi 2) (* (+ i 2) k))

pt9 (polar pt6 (/ pi 2) (* (+ i 3) k))

p10 (polar pt7 (- (/ pi 2)) k)

p11 (polar pt9 (- (/ pi 2)) k)

p12 (polar pt2 (- (/ pi 2)) (* k 2))

p13 (polar p12 0 80))

(command "line" pt0 pt1 pt2 pt3 "c")

(command "line" pt4 pt7 "")

(command "line" pt5 pt8 "")

(command "line" pt6 pt9 "")

(command "line" p10 p11 "")

(command "line" p12 p13 "")

(command "text" (list (+ (car pt2) 2) (+ (cadr pt2) 2)) 3 0 "BANG LIET KE TOA DO GOC RANH")

(command "text" (list (+ (car pt2) 2.5) (- (cadr pt2) 4)) 2 0 "So hieu")

(command "text" (list (+ (car pt2) 4) (- (cadr pt2) 8)) 2 0 "diem")

(command "text" (list (+ (car pt7) 20) (- (cadr pt7) 4)) 2 0 "Toa do")

(command "text" (list (+ (car pt7) 10) (- (cadr pt7) 8)) 2 0 "X(m)")

(command "text" (list (+ (car pt7) 35) (- (cadr pt7) 8)) 2 0 "Y(m)")

(command "text" (list (+ (car pt9) 4) (- (cadr pt9) 6)) 2 0 "Canh")

----------------------------------

Rất cám ơn

Chào bạn khaosat 2009,

Nội dung của các dòng lệnh trên như sau:

1/- Xác định tọa độ các điểm cần thiết để vẽ ra cái khung . Việc xác định tọa độ các điểm này dựa trên tọa độ của điểm đặt khung pt0 mà bạn sẽ chọn và kìch thước chiều cao dòng mà bạn sẽ nhập khi lisp yêu cầu. Trong quá trình xác định điểm này có thể sử dụng 2 phương pháp lấy tọa độ là theo tọa độ dê các hay theo tọa độ độc cực.

2/- Các lệnh vẽ đoạn thẳng nối các điểm trên khung.

3/- Các lệnh nhập text vào các vị trí trên khung.

Khi bạn muốn thay đổi mẫu khung, bạn phải làm như sau:

1/- Xác định các kích thước của khung mẫu như chiều rộng, chiều cao các ô trong khung.

2/- Xác định tọa độ các điểm cần phải vẽ khung theo một điểm chuẩn nào đó mà bạn thích dùng.

3/- Thay thế các dòng code ở trên bằng các dòng code phù hợp.

4/- Xác định nội dung các text cần có trong khung, kích thước text rồi thay thế các dòng code nhập text bằng các dòng code tương ứng.

 

Bạn hãy đọc kỹ các dòng code đó và thử vận dụng sẽ thấy được cụ thể mà.

Chúc bạn thành cô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
Chào bạn khaosat 2009,

Nội dung của các dòng lệnh trên như sau:

1/- Xác định tọa độ các điểm cần thiết để vẽ ra cái khung . Việc xác định tọa độ các điểm này dựa trên tọa độ của điểm đặt khung pt0 mà bạn sẽ chọn và kìch thước chiều cao dòng mà bạn sẽ nhập khi lisp yêu cầu. Trong quá trình xác định điểm này có thể sử dụng 2 phương pháp lấy tọa độ là theo tọa độ dê các hay theo tọa độ độc cực.

2/- Các lệnh vẽ đoạn thẳng nối các điểm trên khung.

3/- Các lệnh nhập text vào các vị trí trên khung.

Khi bạn muốn thay đổi mẫu khung, bạn phải làm như sau:

1/- Xác định các kích thước của khung mẫu như chiều rộng, chiều cao các ô trong khung.

2/- Xác định tọa độ các điểm cần phải vẽ khung theo một điểm chuẩn nào đó mà bạn thích dùng.

3/- Thay thế các dòng code ở trên bằng các dòng code phù hợp.

4/- Xác định nội dung các text cần có trong khung, kích thước text rồi thay thế các dòng code nhập text bằng các dòng code tương ứng.

 

Bạn hãy đọc kỹ các dòng code đó và thử vận dụng sẽ thấy được cụ thể mà.

Chúc bạn thành công.

Cám ơn Bạn, nhưng mình không biết thay thế từ code nào.

Bạn có thể chì giúp mình cụ thể trên đoạc Code trên đi.

cám ơn.

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ạn, nhưng mình không biết thay thế từ code nào.

Bạn có thể chì giúp mình cụ thể trên đoạc Code trên đi.

cám ơn.

Anh Thanh Bình giải thích cho bạn như thế là quá cụ thể rồi. fần còn lại bạn fải tự thân vận động. Đây là những câu lệnh lisp đơn giản nhất mà bất cứ ai mới học đều có thể dễ dàng hiểu được. bạn nên đọc các tài liệu tự học autolisp để có thể tự viết cho đúng ý mình.

Bạn chạy đoạn code này để hiểu đoạn lisp trên của bạn.

 

(defun c:hcn ()

(setq P0 (getpoint "\npick diem can ve HCN"))

(setq P1 (Polar P0 0 20))

(setq P2 (Polar P0 (/ pi 2) 10))

(setq P3 (list (car P1) (cadr P2)))

 

(Command "text" "R" P0 1 0 "P0"

"text" P1 2 0 "P1"

"text" "M" P2 3 45 "P2"

"text" "M" P3 4 90 "P3"

"pline" P0 P1 P3 P2 "C")

);end

Trong đoạn code trên thì:

- điểm gốc P0 là người dùng tự chọn

- P1, P2 là 2 điểm góc của HCN xác định bằng tọa độ cực

- P3 là điểm góc HCN xác định bằng hệ tọa độ góc vuông.

Mình nghĩ thế này là đơn giản nhất có thể để bạn hiểu rồi, mọi người chắc không thể giúp gì thêm cho bạn được nữa.

chúc bạn thành cô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
Anh Thanh Bình giải thích cho bạn như thế là quá cụ thể rồi. fần còn lại bạn fải tự thân vận động. Đây là những câu lệnh lisp đơn giản nhất mà bất cứ ai mới học đều có thể dễ dàng hiểu được. bạn nên đọc các tài liệu tự học autolisp để có thể tự viết cho đúng ý mình.

Bạn chạy đoạn code này để hiểu đoạn lisp trên của bạn.

 

(defun c:hcn ()

(setq P0 (getpoint "\npick diem can ve HCN"))

(setq P1 (Polar P0 0 20))

(setq P2 (Polar P0 (/ pi 2) 10))

(setq P3 (list (car P1) (cadr P2)))

 

(Command "text" "R" P0 1 0 "P0"

"text" P1 2 0 "P1"

"text" "M" P2 3 45 "P2"

"text" "M" P3 4 90 "P3"

"pline" P0 P1 P3 P2 "C")

);end

Trong đoạn code trên thì:

- điểm gốc P0 là người dùng tự chọn

- P1, P2 là 2 điểm góc của HCN xác định bằng tọa độ cực

- P3 là điểm góc HCN xác định bằng hệ tọa độ góc vuông.

Mình nghĩ thế này là đơn giản nhất có thể để bạn hiểu rồi, mọi người chắc không thể giúp gì thêm cho bạn được nữa.

chúc bạn thành công.

Mình viết lại nhưng không chạy được, mong Bạn giúp:

;;;----

(defun c:hcn1 ()

(setq pt0 (getpoint "\n Hay chon diem dat bang toa do")

k (getreal "\n Hay nhap chieu cao dong: ")

pt1 (list (- (car pt0) 80) (cadr pt0))

pt2 (list (car pt1) (+ (cadr pt1) (* (+ i 3) k)))

pt3 (list (car pt0) (cadr pt2))

pt4 (polar pt0 pi 65)

pt5 (polar pt0 pi 40)

pt6 (polar pt0 pi 15)

pt7 (polar pt4 (/ pi 2) (* (+ i 3) k))

pt8 (polar pt5 (/ pi 2) (* (+ i 2) k))

pt9 (polar pt6 (/ pi 2) (* (+ i 3) k))

p10 (polar pt7 (- (/ pi 2)) k)

p11 (polar pt9 (- (/ pi 2)) k)

p12 (polar pt2 (- (/ pi 2)) (* k 2))

p13 (polar p12 0 80))

(command "line" pt0 pt1 pt2 pt3 "c")

(command "line" pt4 pt7 "")

(command "line" pt5 pt8 "")

(command "line" pt6 pt9 "")

(command "line" p10 p11 "")

(command "line" p12 p13 "")

(command "text" (list (+ (car pt2) 2) (+ (cadr pt2) 2)) 3 0 "BANG LIET KE TOA DO GOC RANH")

(command "text" (list (+ (car pt2) 2.5) (- (cadr pt2) 4)) 2 0 "So hieu")

(command "text" (list (+ (car pt2) 4) (- (cadr pt2) 8)) 2 0 "diem")

(command "text" (list (+ (car pt7) 20) (- (cadr pt7) 4)) 2 0 "Toa do")

(command "text" (list (+ (car pt7) 10) (- (cadr pt7) 8)) 2 0 "X(m)")

(command "text" (list (+ (car pt7) 35) (- (cadr pt7) 8)) 2 0 "Y(m)")

(command "text" (list (+ (car pt9) 4) (- (cadr pt9) 6)) 2 0 "Canh")

(setq P1 (Polar P0 0 20))

(setq P2 (Polar P0 (/ pi 2) 10))

(setq P3 (list (car P1) (cadr P2)))

 

);end

;;;

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 viết lại nhưng không chạy được, mong Bạn giúp:

;;;----

(defun c:hcn1 ()

(setq pt0 (getpoint "\n Hay chon diem dat bang toa do")

k (getreal "\n Hay nhap chieu cao dong: ")

pt1 (list (- (car pt0) 80) (cadr pt0))

pt2 (list (car pt1) (+ (cadr pt1) (* (+ i 3) k)))

pt3 (list (car pt0) (cadr pt2))

pt4 (polar pt0 pi 65)

pt5 (polar pt0 pi 40)

pt6 (polar pt0 pi 15)

pt7 (polar pt4 (/ pi 2) (* (+ i 3) k))

pt8 (polar pt5 (/ pi 2) (* (+ i 2) k))

pt9 (polar pt6 (/ pi 2) (* (+ i 3) k))

p10 (polar pt7 (- (/ pi 2)) k)

p11 (polar pt9 (- (/ pi 2)) k)

p12 (polar pt2 (- (/ pi 2)) (* k 2))

p13 (polar p12 0 80))

(command "line" pt0 pt1 pt2 pt3 "c")

(command "line" pt4 pt7 "")

(command "line" pt5 pt8 "")

(command "line" pt6 pt9 "")

(command "line" p10 p11 "")

(command "line" p12 p13 "")

(command "text" (list (+ (car pt2) 2) (+ (cadr pt2) 2)) 3 0 "BANG LIET KE TOA DO GOC RANH")

(command "text" (list (+ (car pt2) 2.5) (- (cadr pt2) 4)) 2 0 "So hieu")

(command "text" (list (+ (car pt2) 4) (- (cadr pt2) 8)) 2 0 "diem")

(command "text" (list (+ (car pt7) 20) (- (cadr pt7) 4)) 2 0 "Toa do")

(command "text" (list (+ (car pt7) 10) (- (cadr pt7) 8)) 2 0 "X(m)")

(command "text" (list (+ (car pt7) 35) (- (cadr pt7) 8)) 2 0 "Y(m)")

(command "text" (list (+ (car pt9) 4) (- (cadr pt9) 6)) 2 0 "Canh")

(setq P1 (Polar P0 0 20))

(setq P2 (Polar P0 (/ pi 2) 10))

(setq P3 (list (car P1) (cadr P2)))

 

);end

;;;

Chào bạn khaosat 2009,

Bạn viết vậy thì lisp không chạy là đúng thôi vì nó có biết cái thằng p0 của bạn là cái gì đâu? Do đó cả cái lũ p1, p2 p3 của bạn nó cũng điếc luôn. Để lisp có thể chạy được bạn phải có hàm xác định thằng p0 này đã bạn ạ.

Ví dụ (setq p0 pt0) chẳng hạn. Như vậy có nghĩa là bạn sẽ lấy điểm p0 trùng với điểm pt0 của đoạn lisp phía trên và khi đó lisp sẽ xác định cho bạn các điểm p1, p2, p3 còn lại.

Với đoạn lisp mà bạn viết thêm vào như vậy thì cái khung bảng tọa độ góc ranh sẽ chả thay đổi gì so với cái khúc lisp cũ của bạn cả mà chỉ thêm được 4 điểm nữa là p0, p1, p2, p3 trong đó p0 trùng với cái điểm pt0 mà bạn đã chọn khi vẽ khung bảng tọa độ góc ranh.

Bạn cố gắng đọc kỹ hơn về các hàm cơ bản của lisp bạn nhé.

Chúc bạn thành công trong công việc với lisp.

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 có sưu tầm được Lisp vẽ toạ độ các đỉnh đường,

sau đó thống kê ra bảng tọa độ, có : stt -- X -- Y-- Ghi chú

Mình muô1n kẻ thêm 1 cột nửa ví dụ như Ghi chú 1 với khoảng cách cột là 20

Nhờ bạn giúp cho hướng dẫn để vẽ thêm cột vào lisp , mình mò chỉnh nhưng không đúng;

Mong được các anh chỉ giúp.

 

;;;------------------

;; free lisp from cadviet.com

 

(prompt"\n[cmd : TDN] - THONG KE TOA DO\n")

----------------------------------------------

(defun C:tdn4 () (prompt"\nTHONG KE TOA DO\n")

(setvar "cmdecho" 0 )

(command "Undo" "Begin")

(setq om (getvar "osmode"))

(setq tapx '() tapy '() stt '()

ten (getstring "\nTên Nút:"))

(if (not h) (setq h 1))

(if (not i) (setq i 1))

(setq i1 (getreal (strcat"\nSTT Nút Ðâu Tiên < " (rtos i 2 0) " >: "))

caot1 (getreal (strcat "\nCao text < " (rtos h 2 0) " >:")))

(if i1 (setq i i1))

(if caot1 (setq h caot1))

(setvar "osmode" 125)

(setq lacol (getvar "CEColor") k (- i 1))

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

(While

(setq D1 (getpoint (strcat"\nPick diem thu "(rtos (+ k 1) 2 0)"")))

(Progn

(setvar "osmode" 0)

(setq DX (getpoint (strcat"\nDiem dat text thu "(rtos (+ k 1) 2 0)"") D1)

x (rtos (car D1) 2 4)

y (rtos (cadr D1) 2 4)

TX (strcat "X:"(rtos (Car D1) 2 4))

TY (strcat "Y:"(rtos (Cadr D1) 2 4))

tapx (append tapx (list x))

tapy (append tapy (list y))

k (+ 1 k)

N (strcat ten (rtos k 2 0))

stt (append stt (list N))

);setq

(if (>= (car DX) (car D1))

(progn

(setq D2 (list (+ (car DX) (* 0.5 h)) (cadr DX)))

(command "text" "BL" D2 h 0 tX)

(setq TB (textbox (entget(entlast)))

LC (car TB)

RC (cadr TB)

di (distance LC RC)

PT3 (polar D2 0 (+ di (* 0.6 h)))

pt4 (list (car D2) (- (cadr D2) (* 1.35 h)))

pt5 (list (+ (car D2) di) (- (cadr D2) (* 1.35 h)))

C (polar PT3 0 (* 1.5 h))

);setq

(command "text" "F" PT4 PT5 h ty

"pline" D1 DX PT3 ""

"circle" (polar PT3 0 (* 1.5 h)) (* 1.5 h)

"circle" (polar PT3 0 (* 1.5 h)) (* 1.35 h)

"text" "m" (polar PT3 0 (* 1.5 h)) h 0 N

"CECOLOR" 8

"circle" (polar PT3 0 (* 1.5 h)) (* 1.35 h)

);command

(setvar "CECOLOR" lacol)

);progn

);if

(if (< (car DX) (car D1))

(progn

(setq D2 (list (- (car DX) (* 0.5 h)) (cadr DX)))

(command "text" "BR" D2 h 0 tx)

(setq TB (textbox (entget(entlast)))

LC (car TB)

RC (cadr TB)

di (distance LC RC)

PT3 (polar D2 0 (- (+ di (* 0.6 h))))

pt4 (list (- (car D2) di) (- (cadr D2) (* 1.35 h)))

pt5 (list (car D2) (- (cadr D2) (* 1.35 h)))

PT6 (list (- (car PT3) (* 3 h)) (cadr PT3))

C (polar PT3 0 (* 1.5 h))

);setq

(command "text" "F" PT4 PT5 h TY

"pline" D1 DX PT3 ""

"circle" (polar PT6 0 (* 1.5 h)) (* 1.5 h)

"text" "m" (polar PT6 0 (* 1.5 h)) h 0 N

"CECOLOR" 8

"circle" (polar PT6 0 (* 1.5 h)) (* 1.35 h)

);command

(setvar "CECOLOR" lacol)

);progn

);if

);progn

(setvar "osmode" 125)

);while

(setq i (+ k 1))

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

(setq bit (cond (bit) ("Yes")))

(initget "Yes No")

(setq Tmp (strcat "\nXuât Bang Toa Ðô? [Yes/No] <" bit ">: ")

bit (cond ((getkword Tmp)) (bit)))

(if (eq bit "Yes")

(progn

(setq di (- di (* 1.7 h))

kc (* 2 di)

PT (getpoint"\nVi tri dat bang")

PTC (list (+ (* 2 kc) di (car PT)) (cadr PT))

PTCc (list (+ (* 1.5 kc) (car PTC)) (cadr PT))

PTCa (list (+ (* 1.5 kc) (car PTC)) (cadr PT))

p1 (list (car PT) (+ (cadr PT)(* 2 h)))

p2 (list (car PTC) (+ (cadr PTC)(* 2 h)))

p2c (list (+ (* 1.5 kc) (car P2)) (cadr p2))

p2ca (list (+ (* 1.5 kc) (car P2c)) (cadr p2c))

p3 (list (car p1) (+ (cadr p1)(* 2 h)))

p4 (list (car p2) (+ (cadr p2)(* 2 h)))

p4c (list (+ (* 1.5 kc) (car P4)) (cadr p4))

p4ca (list (+ (* 1.5 kc) (car P4c)) (cadr p4c))

PTD (list (+ (/ di 2) (car PT)) (+ h (cadr PT)))

PTX (list (+ di (/ di 2) (car PTD)) (cadr PTD))

PTY (list (+ kc (car PTX)) (cadr PTX))

p11 (list (+ (/ di 2) (car p1)) (+ h (cadr p1)))

p22 (list (+ di (/ di 2) (car p11)) (cadr p11))

p33 (list (+ kc (car p22)) (cadr p22))

p44 (list (+ (* kc 0.75) (car p4)) (cadr p22))

p55 (list (+ (* kc 0.75) (car p4)) (cadr p22))

L1 (list (+ di (car p3))(cadr p3))

L2 (list (+ kc (car L1))(cadr L1))

L3 (list (+ (* 1.5 kc) (car p4)) (cadr p4))

L4 (list (+ (* 1.5 kc) (car p4)) (cadr p4))

PTB (list (+ (* 0.5 (+ (* 2 kc) (* 1.5 kc) di)) (car PT)) (+ (cadr P3) (* 1.8 h)))

n (length tapx)

k 0

);setq

(setvar "osmode" 0)

(command "CECOLOR" 3 "line" p1 p2c "" "line" p3 p4c "" "CECOLOR" 2

"text" "m" p11 h 0 "STT"

"text" "m" p22 h 0 "Täa ®é X"

"text" "m" p33 h 0 "Täa ®é Y"

"text" "m" p44 h 0 "Ghi chó"

"text" "m" p55 h 0 "Ghi chó a"

"text" "m" pTB (* 1.3 h) 0 "%%UB¶ng thèng kª täa ®é nót")

(while (< k n)

(setq xx (nth k tapx) yy (nth k tapy) tstt(nth k stt))

(command "CECOLOR" 2

"text" "m" PTD h 0 tstt

"text" "m" PTX h 0 xx

"text" "m" PTY h 0 yy

"CECOLOR" 3

"line" PT PTCc "")

(setq PT (list (car PT) (- (cadr PT)(* 2 h)))

PTC (list (+ (* 2 kc) di (car PT)) (cadr PT))

PTCc (list (+ (* 1.5 kc) (car ptc)) (cadr ptc))

PTCa (list (+ (* 1.5 kc) (car ptc)) (cadr ptc))

PTD (list (+ (/ di 2) (car PT)) (+ h (cadr PT)))

PTX (list (+ di (/ di 2) (car PTD)) (cadr PTD))

PTY (list (+ kc (car PTX)) (cadr PTX))

k (+ 1 k));setq

);while

(if (= k n)

(setq PT (list (car PT) (+ (cadr PT)(* 2 h)))

PTC (list (+ (* 2 kc) di (car PT)) (cadr PT))

L11 (list (+ di (car PT))(cadr PT))

L22 (list (+ kc (car L11))(cadr L11))

L33 (list (+ (* 1.5 kc) (car PTC)) (cadr PTC))

L44 (list (+ (* 1.5 kc) (car PTC)) (cadr PTC))

 

 

);setq

);if

(command "CECOLOR" 3

"line" p3 PT ""

"line" p4 PTC ""

"line" L1 L11 ""

"line" L2 L22 ""

"line" L3 L33 "")

"line" L3 L44 "")

 

);progn

);if

(setvar "CECOLOR" lacol)

(setvar "osmode" om)

(prompt"\n[TDN - THONG KE TOA DO] by Thaistreetz - huuthais@yahoo.com\n")

(command "Undo" "End")

(setvar "cmdecho" 1)

(princ)

);DONG toado

 

;;;------------------------------------------

 

Rất cám ơn

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 có sưu tầm được Lisp vẽ toạ độ các đỉnh đường,

sau đó thống kê ra bảng tọa độ, có : stt -- X -- Y-- Ghi chú

Mình muô1n kẻ thêm 1 cột nửa ví dụ như Ghi chú 1 với khoảng cách cột là 20

Nhờ bạn giúp cho hướng dẫn để vẽ thêm cột vào lisp , mình mò chỉnh nhưng không đúng;

Lisp này là một trong những lisp đầu tiên mình viết và nó đã được chỉnh sửa cho hợp nhu cầu của bác Tuynh. Vì là lisp chỉnh sửa nhiều lần nên hiện giờ nó rất "rác" trong các câu lệnh, và nói thật là giờ bạn yêu cầu mình chỉnh sửa tiếp "đống rác" này thì mình chịu thua. lần mò lại các biến để vẽ bảng thống kê thực sự rất mệt mỏi và mất thời gian.

Mình đang thắc mắc là bạn sử dụng lisp này với tần suất thế nào? không lẽ nhiều đến nỗi bạn cần fải thêm cho nó một cột để tiết kiệm thời gian vẽ trong khi để thêm 1 cột đó bạn chỉ cần vài lệnh vẽ đơn giản để có được thứ bạn muốn. Mình nghĩ vài fút thời gian tiết kiệm của bạn sẽ fải đánh đổi bằng vài tiếng đồng hồ của mình. vì thế bạn fải tự khắc fục thôi, hoặc bạn tự nghiên cứu để sửa nó.

Chúc bạn thành cô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

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

×