Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#2081 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 01 October 2010 - 07:02 PM

ý em là các kích thước cạnh được phân cách bằng dấu "," chứ không phải dấu "." như lisp đã thực hiện.
em muốn lisp thực hiện thêm việc tích diện tích và ghi ra tại ngay điễm đả pick..
đây là file mẩu
http://www.cadviet.c...les/3/vd1_1.dwg

Đáp ứng theo y/c của bạn đây :
http://www.cadviet.c...files/3/vc_.lsp
  • 2

#2082 quycu87

quycu87

    Chưa sử dụng CAD

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

Đã gửi 01 October 2010 - 07:06 PM

các bác co thể sơ lươc qua cách viết autolist cho em được không?
cho kĩ kĩ tý nhé. mình chậm hiểu lắm. hhhhiiiiiiiiiiiiiiiiii :cheers: :cheers:
  • 0

#2083 hochoaivandot

hochoaivandot

    biết dimradius

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

Đã gửi 01 October 2010 - 07:54 PM

các bác co thể sơ lươc qua cách viết autolist cho em được không?
cho kĩ kĩ tý nhé. mình chậm hiểu lắm. hhhhiiiiiiiiiiiiiiiiii :cheers: :cheers:


Nói sơ qua thì nó là autolisp chứ không phải autolist
Câu 1 là nói "sơ lược", Câu 2 là nói "kĩ kĩ". Yêu cầu như vậy hiểu được là may lắm rồi chứ hiểu chậm còn đỡ. Ẹc ẹc!
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#2084 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 October 2010 - 08:05 PM

Bạn ơi khi mình dùng lệnh UCS chuyển tọa độ 0,0 về 1 điểm mới thì chạy lisp không ra được kết quả đúng, nó chỉ trả về tọa độ ứng với điểm 0,0 ban đầu. Bạn kiểm tra lại giúp mình nhé.

Bạn viết lại lisp theo cấu trúc này được không:
- Pick vào 1 điểm => tạo boundary => xuất ra tọa độ vào file text. (Không cần ghi tọa độ Z) => xóa boundary vừa tạo.
- Thông báo lựa chọn tiếp tục hay dừng Y/N , mặc định là Y
- Nhấn Enter để tiếp tục pick tiếp => xuất ra vào text đã có sẵn trên, dữ liệu ghi thêm vào phía dưới.
- Kết thúc lisp khi chọn N

Hề hề hề,
Mạn phép bác phamngoctukts, sửa giùm bạn hdt4151 cái lisp bác đã viết để bạn ấy đỡ tủi.
Bạn hdt4151 ơi, mình làm cái này chưa hẳn đã đúng với cái cấu trúc bạn quy định như hình như nó cũng ra kết quả như bạn mong muốn, bạn xài thử coi sao:


;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
i 0)
(setvar "osmode" 0)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (car p1) 2 3)
"\t"
(rtos (cadr p1) 2 3)
;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;(rtos (caddr p1) 2 3)
)
)
dlst)
)
(setq i (1+ i))
)
(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
)
)
(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)

)




Chúc bạn vui.

@Bác phmangoctukts: Bác rào dậu lisp kỹ thế, đóng cái thằng (defun c:tdd .....)) những hai lượt cơ ạ.... Hề hề hề......
@hdt4151: Cái vụ chuyển hệ tọa độ thì bạn tự làm lấy nhé. Nó dựa trên nguyên tắc lấy tọa độ tương đối thôi mà. Bạn chịu khó suy nghĩ một tí là ra thôi. Làm nó không khó nhưng mình thấy nên để bạn tự suy nghĩ thì tốt hơn. Hề hề hề.....

Bài viết được sửa bởi Phạm Thanh Bình ngày 3/10/2010.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2085 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 October 2010 - 08:09 PM

Nói sơ qua thì nó là autolisp chứ không phải autolist
Câu 1 là nói "sơ lược", Câu 2 là nói "kĩ kĩ". Yêu cầu như vậy hiểu được là may lắm rồi chứ hiểu chậm còn đỡ. Ẹc ẹc!

Hề hề hề,
Ấy là các cụ bảo thế mà. Tranh thủ lúc mày nghỉ ngơi xay cho u cối lúa nhé.
Hề hề hề.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2086 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 October 2010 - 08:29 PM

Đáp ứng theo y/c của bạn đây :
http://www.cadviet.c...files/3/vc_.lsp

Hề hề hề,
Bác Tue_NV ơi, cái này hình như hơi dư so với cái mẫu của bạn kamezoko thì phải.......
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2087 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 01 October 2010 - 08:55 PM

@phamthanhbinh: thanks!! mình chạy được rồi, nhưng vẫn còn bị lỗi khi dùng lệnh UCS chuyển toạ độ 0,0 về 1 điểm khác, cho ra toạ độ sai (chỉ cho ra toạ độ ứng với điểm 0,0 ban đầu) . Còn cái nữa là sau mỗi lần pick tự động chèn 1 dòng trắng trong file text để phân biệt được các nhóm toạ độ khác nhau, bạn giúp mình sửa nhé :cheers: (sau khi chọn chọn y/n , xoá đi cái boundary trước đó thì càng tốt ^^)
  • 0

#2088 tamkt

tamkt

    biết vẽ ellipse

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

Đã gửi 01 October 2010 - 09:03 PM

Bạn làm như sau :
Command: len
LENGTHEN
Select an object or [DElta/Percent/Total/DYnamic]: T -> Gõ T

Specify total length or [Angle] <1.0000)>: 500 -> Gõ chiều dài (ví dụ 500)

Select an object to change or [Undo]: -> Kích vào đầu mút của LINE hoặc PLINE
Select an object to change or [Undo]: -> Kích vào đầu mút của LINE hoặc PLINE tiếp theo
Select an object to change or [Undo]:.......
................................................................................

.........
Tùy chọn Undo để hoàn trả lại chiều dài của LINE hoặc PLINE mà bạn đã pick

-> CAD sẽ tính chiều dài = 500 (điểm gốc của mút tính từ.....Bạn làm xong sẽ biết ha)
Chúc thành công


Trời ơi, thật là tuyệt, mấy bữa giờ e làm ngu cả mặt ra, đo rùi vẽ, dim rùi cắt.
Anh đúng là cao thủ,hihi. Cám ơn anh nhiều.
  • 0

#2089 tamkt

tamkt

    biết vẽ ellipse

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

Đã gửi 01 October 2010 - 09:15 PM

Của bạn đây. Bạn có thể chọn nhiều đường line cuòng một lúc. Chú ý các đường line này lấy gốc là điểm bắt đầu vẽ line


(defun c:keol ()
(setq ss (ssget '((0 . "line")))
i 0
kt (getreal "\nnhap kich thuoc moi: ")
)
(while (< i (sslength ss))
(setq p1 (cdr (assoc 10 (entget (ssname ss i))))
p2 (cdr (assoc 11 (entget (ssname ss i))))
pm (polar p1 (angle p1 p2) kt)
)
(entmod (subst (cons 11 pm) (cons 11 p2) (entget (ssname ss i))))
(setq i (1+ i))
)
)


Cám ơn anh, bây giờ e có cả hai cách để thay đổi chiều dài đoạn thẳng. Lisp thật tuyệt.

cám ơn anh rất nhiều.
  • 0

#2090 kamezoko

kamezoko

    biết vẽ line

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

Đã gửi 01 October 2010 - 10:50 PM

Đáp ứng theo y/c của bạn đây :
http://www.cadviet.c...files/3/vc_.lsp

cám ơn anh Tue_NV nhiều,lần nào anh cũng giúp em...lisp chạy như em yêu cầu.. :cheers: thank tất cả
  • 0

#2091 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 02 October 2010 - 01:56 PM

@phamthanhbinh: thanks!! mình chạy được rồi, nhưng vẫn còn bị lỗi khi dùng lệnh UCS chuyển toạ độ 0,0 về 1 điểm khác, cho ra toạ độ sai (chỉ cho ra toạ độ ứng với điểm 0,0 ban đầu) . Còn cái nữa là sau mỗi lần pick tự động chèn 1 dòng trắng trong file text để phân biệt được các nhóm toạ độ khác nhau, bạn giúp mình sửa nhé :cheers: (sau khi chọn chọn y/n , xoá đi cái boundary trước đó thì càng tốt ^^)

Chào hdt4151,
Bạn không đọc bài của mình sao???
Cái đó không phải là lỗi mà là cái mình muốn bạn phải tự suy nghĩ và tìm ra cách giải quyết. Mình đã gợi ý mà bạn không chịu suy nghĩ. Nếu bạn vẫn không hiểu được khái niệm tọa độ tương đối thì bạn nên học lại đi nhé. Từ bảng tọa độ tuyệt đối đã có, việc chuyển nó về tọa độ tương đối chả có gì là khó khăn cả mà bạn không chịu suy nghĩ thì quả thật đáng buồn cho một cán bộ kỹ thuật bạn ạ. Hình như thói quen ỷ lại đã ngấm vào máu bạn rồi thì phải.
Việc dùng lisp hay dùng tay để làm việc đó cũng chả có gì khác nhau cả. Chỉ là vấn đề của bạn mà thôi.
Việc bạn chỉ muốn xài lisp mà không muốn tìm hiểu về nó cho kỹ sẽ không phải là điều hay đâu, vì nếu bạn không hiểu sẽ có những trường hợp mà sau khi bạn dùng một cái lisp vay mượn nào đó thì máy của bạn sẽ có những bất thường mà bạn không thể hiểu được và thế là lại ối u ơi hay sao???
Mong rằng bạn hãy cố gắng để hiểu và vận dụng được những điều đơn giản nhất trong lisp nhằm phục vụ tốt cho công việc của bạn.
Lisp bạn đây, nếu bạn chưa hài lòng thì hãy cố mà học để làm cho nó hoàn thiện hơn. Mình chỉ có thể giúp bạn được vậy thôi.

;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
p2 (getpoint "\n Chon goc toa do ")
i 0)
(setvar "osmode" 0)
(if (= p2 nil)
(setq p2 (list 0 0 0))
)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (- (car p1) (car p2)) 2 3)
"\t"
(rtos (- (cadr p1) (cadr p2)) 2 3)
;;;;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;;;;(rtos (- (caddr p1) (caddr p2)) 2 3)
)
)
dlst)
)

(setq i (1+ i))

)
(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
)
(setq dlst (append (list "\n") dlst))
(command "erase" name "")
)

(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)

)


PS: bạn hãy chịu khó so sánh cái lisp của mình và của bác phamngoctukts sẽ thấy những điểm khác biệt và sẽ hiểu được vì sao có sự khác biệt ấy từ việc so sánh kết quả của nó bạn nhé. Chỗ nào chưa hiểu thì hỏi lại, dần dần bạn sẽ hiểu mà thôi.

Chúc bạn 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.

#2092 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 02 October 2010 - 06:30 PM

Hề hề hề,
Mạn phép bác phamngoctukts, sửa giùm bạn hdt4151 cái lisp bác đã viết để bạn ấy đỡ tủi.
Bạn hdt4151 ơi, mình làm cái này chưa hẳn đã đúng với cái cấu trúc bạn quy định như hình như nó cũng ra kết quả như bạn mong muốn, bạn xài thử coi sao:



;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
i 0)
(setvar "osmode" 0)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (car p1) 2 3)
"\t"
(rtos (cadr p1) 2 3)
;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;(rtos (caddr p1) 2 3)
)
)
dlst)
)
(setq i (1+ i))
)
(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
)
)



Chúc bạn vui.

@Bác phmangoctukts: Bác rào dậu lisp kỹ thế, đóng cái thằng (defun c:tdd .....)) những hai lượt cơ ạ.... Hề hề hề......
@hdt4151: Cái vụ chuyển hệ tọa độ thì bạn tự làm lấy nhé. Nó dựa trên nguyên tắc lấy tọa độ tương đối thôi mà. Bạn chịu khó suy nghĩ một tí là ra thôi. Làm nó không khó nhưng mình thấy nên để bạn tự suy nghĩ thì tốt hơn. Hề hề hề.....

Chào bác Bình! Cám ơn bác đã hoàn thành nốt lisp giúp em. Em đang ốm quá nên không theo dõi diễn đàn được. Em chưa kiểm tra lisp của em nhưng code này của bác hình như thiếu một dấu ). Em load vào nó báo lỗi. Code sau này của bác thì ngon rồi khỏi phải bàn.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#2093 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 02 October 2010 - 08:01 PM

Tình hình là có cái lisp đo tổng chiều dài (không bít bác nào viết) của Cadviet nhà mình thế này :
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length = " (rtos L)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vấn đề là em cần điền cái giá trị đo được vào bảng thống kê bên cạnh, tức llà pick vào cái text có sẵn để nó thay giá trị vừa đo vào, :cheers:( cái naỳ chắc đơn giản nhưng mà em gà vịt mò mãi không sửa được, bác nào cao thủ chỉ bảo giùm em với , thank so much!
  • 0

#2094 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 02 October 2010 - 08:47 PM

Tình hình là có cái lisp đo tổng chiều dài (không bít bác nào viết) của Cadviet nhà mình thế này :
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length = " (rtos L)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vấn đề là em cần điền cái giá trị đo được vào bảng thống kê bên cạnh, tức llà pick vào cái text có sẵn để nó thay giá trị vừa đo vào, :cheers:( cái naỳ chắc đơn giản nhưng mà em gà vịt mò mãi không sửa được, bác nào cao thủ chỉ bảo giùm em với , thank so much!

Thử vầy xem:
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(setq noidungm (rtos L))
(suatext)
)

;;;;;;;;;;;
(defun suatext ()
(setq ddd (entsel "\nChon text viet ket qua"))
(while
(or
(null ddd)
(and (/= "TEXT" (cdr (assoc 0 (entget (car ddd))))) (/= "MTEXT" (cdr (assoc 0 (entget (car ddd)))))
)
)
(setq ddd (entsel "\nDoi tuong phai la TEXT hoac MTEXT! Chon lai"))
)
(setq DT (car ddd))
(setq DTM (entget DT))
(setq noidung noidungm)
(setq DTM (subst (cons 1 NOIDUNG) (assoc 1 DTM) DTM))
(entmod DTM)
(Princ))

  • 1

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


#2095 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 02 October 2010 - 09:29 PM

Ôi, thanks bác Duy nhiều nhiều, đúng ý em roài, em đang đọc tàil liệu về Lisp đây, hi vọng ngày nào đó tự viết được cho mình 1 cái :cheers:, em còn một thắc mắc nữa, nhưng mà thui, để mai hỏi các bác vậy, tối nay ngồi ngắm nghía học hỏi đoạn lisp của bác Duy cái đã ^^
____________________________________________
Hì, đây là câu hỏi của em hum nay; em sưu tầm được 1 lisp như thế này :
defun c:n(/ pt1 pt2 l2 pt3)
(setq pt1(getpoint "\n nhap diem:"))
(setq pt2(getpoint "\n nhap diem:"))
(setq l2 ( rtos(distance pt1 pt2)))
(setq pt3(list (/ (+ (car pt1) (car pt2)) 2) (cadr pt1) 0
)
)
(prompt l2)
(command "text" "mc" pt3 0 l2 "")
)
;;;;;;;;;
Em đọc thì cũng hiểu là nó điền khoảng cách giữa 2 điểm pt1 và pt2 vào trung điểm là pt3, nhưng mà giờ em muốn sau khi điền thì tiếp tục đo từ điểm pt2, nên theo em đoán là gán điểm pt1 là điểm pt2 còn pt2 thì yêu cầu chọn tiếp...lặp đến khi nào enter hoặc space thì xong, Em thử thế này:
defun c:n(/ pt1 pt2 l2 pt3)
(setq pt1(getpoint "\n nhap diem dau tien:"))
(while
(setq pt2(getpoint "\n nhap diem tiep theo:"))
(setq l2 ( rtos(distance pt1 pt2)))
(setq pt3(list (/ (+ (car pt1) (car pt2)) 2) (cadr pt1) 0
)
)
(prompt l2)
(command "text" "mc" pt3 0 l2 "")
(setq pt1 pt2)
)
)
Nhưng mà hình như không được :cheers: tại em thấy có lisp dùng hàm while mà không thấy điều kiện đâu cả, bác các bác chỉ bảo thêm em với..
  • 0

#2096 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 03 October 2010 - 09:27 AM

Chào hdt4151,
Bạn không đọc bài của mình sao???
Cái đó không phải là lỗi mà là cái mình muốn bạn phải tự suy nghĩ và tìm ra cách giải quyết. Mình đã gợi ý mà bạn không chịu suy nghĩ. Nếu bạn vẫn không hiểu được khái niệm tọa độ tương đối thì bạn nên học lại đi nhé. Từ bảng tọa độ tuyệt đối đã có, việc chuyển nó về tọa độ tương đối chả có gì là khó khăn cả mà bạn không chịu suy nghĩ thì quả thật đáng buồn cho một cán bộ kỹ thuật bạn ạ. Hình như thói quen ỷ lại đã ngấm vào máu bạn rồi thì phải.
Việc dùng lisp hay dùng tay để làm việc đó cũng chả có gì khác nhau cả. Chỉ là vấn đề của bạn mà thôi.
Việc bạn chỉ muốn xài lisp mà không muốn tìm hiểu về nó cho kỹ sẽ không phải là điều hay đâu, vì nếu bạn không hiểu sẽ có những trường hợp mà sau khi bạn dùng một cái lisp vay mượn nào đó thì máy của bạn sẽ có những bất thường mà bạn không thể hiểu được và thế là lại ối u ơi hay sao???
Mong rằng bạn hãy cố gắng để hiểu và vận dụng được những điều đơn giản nhất trong lisp nhằm phục vụ tốt cho công việc của bạn.
Lisp bạn đây, nếu bạn chưa hài lòng thì hãy cố mà học để làm cho nó hoàn thiện hơn. Mình chỉ có thể giúp bạn được vậy thôi.


;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y"
;;;;;;;;;;;;;;;;;"\t" "Z"
"\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
p2 (getpoint "\n Chon goc toa do ")
i 0)
(setvar "osmode" 0)
(if (= p2 nil)
(setq p2 (list 0 0 0))
)
(while (/= p nil)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (- (car p1) (car p2)) 2 3)
"\t"
(rtos (- (cadr p1) (cadr p2)) 2 3)
;;;;;;;;;;;;;;;;"\t"
;;;;;;;;;;;;;;;;(rtos (- (caddr p1) (caddr p2)) 2 3)
)
)
dlst)
)

(setq i (1+ i))

)
(setq ans (strcase (getstring "\n Ban muon tiep tuc (y or n): ")))
(if (/= ans "N")
(progn
(setq p (getpoint "\n Hay chon diem thuoc da giac tiep theo")
i 0)
)
(setq p nil)
)
(setq dlst (append (list "\n") dlst))
(command "erase" name "")
)

(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)

)


Thank bạn rất nhiều, Lisp chạy trên 1 file mới kết quả hoàn toàn chính xác, đúng như mình mong muốn!
Mình mới biết chút ít về lisp chưa thông thạo về lệnh cũng như cách lấy kết quả, mình sẽ học hỏi thêm.

Vấn đề khác là khi dùng lisp trên vào 1 file có sẵn, do 1 người khác chuyển gốc toạ độ sang 1 vị trí khác (xin lỗi vì lúc đầu mình nói không đúng ý này) , thì lisp chạy không ra kết quả đúng.

Bạn xem file dưới đây (cái gì cũng phải minh hoạ cho chắc ăn ^^!) nhé:

http://www.cadviet.c...files/3/a_1.dwg

Mình đã vẽ 1 hình vuông 10x10 tại toạ độ 0,0 . Nếu chạy lisp, chọn gốc toạ độ, theo lý thuyết (ở 1 file mới hoàn toàn) sẽ cho ra kết quả
X Y

10.000 10.000
0.000 10.000
0.000 0.000
10.000 0.000

Nhưng kết quả ở file trên khi chạy lisp sẽ cho ra kết quả này:

X Y

5010.000 5010.000
5000.000 5010.000
5000.000 5000.000
5010.000 5000.000

Bạn có thể viết lisp sao cho ra kết quả đúng ở mọi file không ?
  • 0

#2097 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 03 October 2010 - 11:14 AM

Thank bạn rất nhiều, Lisp chạy trên 1 file mới kết quả hoàn toàn chính xác, đúng như mình mong muốn!
Mình mới biết chút ít về lisp chưa thông thạo về lệnh cũng như cách lấy kết quả, mình sẽ học hỏi thêm.

Vấn đề khác là khi dùng lisp trên vào 1 file có sẵn, do 1 người khác chuyển gốc toạ độ sang 1 vị trí khác (xin lỗi vì lúc đầu mình nói không đúng ý này) , thì lisp chạy không ra kết quả đúng.

Bạn xem file dưới đây (cái gì cũng phải minh hoạ cho chắc ăn ^^!) nhé:

http://www.cadviet.c...files/3/a_1.dwg

Mình đã vẽ 1 hình vuông 10x10 tại toạ độ 0,0 . Nếu chạy lisp, chọn gốc toạ độ, theo lý thuyết (ở 1 file mới hoàn toàn) sẽ cho ra kết quả
X Y

10.000 10.000
0.000 10.000
0.000 0.000
10.000 0.000

Nhưng kết quả ở file trên khi chạy lisp sẽ cho ra kết quả này:

X Y

5010.000 5010.000
5000.000 5010.000
5000.000 5000.000
5010.000 5000.000

Bạn có thể viết lisp sao cho ra kết quả đúng ở mọi file không ?

Chào bạn hdt4151,
Bạn nên biết rằng các tọa độ mà lisp dùng để tính toán là trong hệ tọa độ tuyêt đối World. còn bản vẽ bạn post là sử dụng hệ tọa độ tương đối do người dùng tự chọn. Do vậy bạn phải chuyển các tọa độ từ tọa độ tuyệt đối về tọa độ tương đối theo hệ trục của người dùng.
Trong đoạn lisp của mình đã có phép chuyển tọa độ này, bạn hãy tìm hiểu và bổ sung thêm vào lisp bạn dùng cho đúng là được.
Để có được tọa độ tuyệt đối của gốc tọa độ người dùng bạn có thể sử dụng biến hệ thống UCSORG trong cad bằng cách dùng hàm (getvar "ucsorg"). Sau đó bạn bổ sung vào lisp trên các tọa độ này là ổn theo như việc mình bổ sung đoạn chọn điểm gốc tọa độ mới đó.
Chúc bạn thành công.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2098 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 03 October 2010 - 02:09 PM

Ôi, thanks bác Duy nhiều nhiều, đúng ý em roài, em đang đọc tàil liệu về Lisp đây, hi vọng ngày nào đó tự viết được cho mình 1 cái :cheers:, em còn một thắc mắc nữa, nhưng mà thui, để mai hỏi các bác vậy, tối nay ngồi ngắm nghía học hỏi đoạn lisp của bác Duy cái đã ^^
____________________________________________
Hì, đây là câu hỏi của em hum nay; em sưu tầm được 1 lisp như thế này :
defun c:n(/ pt1 pt2 l2 pt3)
(setq pt1(getpoint "\n nhap diem:"))
(setq pt2(getpoint "\n nhap diem:"))
(setq l2 ( rtos(distance pt1 pt2)))
(setq pt3(list (/ (+ (car pt1) (car pt2)) 2) (cadr pt1) 0
)
)
(prompt l2)
(command "text" "mc" pt3 0 l2 "")
)
;;;;;;;;;
Em đọc thì cũng hiểu là nó điền khoảng cách giữa 2 điểm pt1 và pt2 vào trung điểm là pt3, nhưng mà giờ em muốn sau khi điền thì tiếp tục đo từ điểm pt2, nên theo em đoán là gán điểm pt1 là điểm pt2 còn pt2 thì yêu cầu chọn tiếp...lặp đến khi nào enter hoặc space thì xong, Em thử thế này:
defun c:n(/ pt1 pt2 l2 pt3)
(setq pt1(getpoint "\n nhap diem dau tien:"))
(while
(setq pt2(getpoint "\n nhap diem tiep theo:"))
(setq l2 ( rtos(distance pt1 pt2)))
(setq pt3(list (/ (+ (car pt1) (car pt2)) 2) (cadr pt1) 0
)
)
(prompt l2)
(command "text" "mc" pt3 0 l2 "")
(setq pt1 pt2)
)
)
Nhưng mà hình như không được :cheers: tại em thấy có lisp dùng hàm while mà không thấy điều kiện đâu cả, bác các bác chỉ bảo thêm em với..

Chào bạn pfievxd,
Bạn hãy thử cái này xem nhé và so sánh để tìm ra cái chưa đúng trong cái lisp bạn đã viết

defun c:n(/ pt1 pt2 l2 pt3)
(setq pt1(getpoint "\n nhap diem:"))
(setq pt2(getpoint "\n nhap diem:"))
(while (/= pt2 nil)
(setq l2 ( rtos(distance pt1 pt2)))
(setq pt3(list (/ (+ (car pt1) (car pt2)) 2) (cadr pt1) 0
)
)
(prompt l2)
(command "text" "mc" pt3 0 l2 "")
(setq pt1 pt2
pt2 (getpoint "\n Chon diem tiep theo" )
)
)
)


Chúc bạn vui.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2099 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 03 October 2010 - 06:48 PM

Chào bác Bình! Cám ơn bác đã hoàn thành nốt lisp giúp em. Em đang ốm quá nên không theo dõi diễn đàn được. Em chưa kiểm tra lisp của em nhưng code này của bác hình như thiếu một dấu ). Em load vào nó báo lỗi. Code sau này của bác thì ngon rồi khỏi phải bàn.

Xin lỗi bác phamngoctukts,
Mình chả hiểu tại sao nữa, có lẽ trang upload của diễn đàn bị lỗi gì đó, chứ đoạn code mình post đó bị thiếu luôn cả đoạn ghi tọa độ điểm vào file bác ạ.
Khi test lisp mình đã xem kỹ rồi mà sao khi post lên lại bị vậy.
Mà cũng lạ là sao thiếu vậy mà bạn hdt4151 vẫn chạy lisp để kiểm tra được????

@phamthanhbinh: thanks!! mình chạy được rồi, nhưng vẫn còn bị lỗi khi dùng lệnh UCS chuyển toạ độ 0,0 về 1 điểm khác, cho ra toạ độ sai (chỉ cho ra toạ độ ứng với điểm 0,0 ban đầu) . Còn cái nữa là sau mỗi lần pick tự động chèn 1 dòng trắng trong file text để phân biệt được các nhóm toạ độ khác nhau, bạn giúp mình sửa nhé :cheers: (sau khi chọn chọn y/n , xoá đi cái boundary trước đó thì càng tốt ^^)

Mình đã sửa lại ngay trong bài post đó bác ạ.(số 2114)
Chúc bác vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2100 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 03 October 2010 - 10:17 PM

Xin lỗi bác phamngoctukts,
Mình chả hiểu tại sao nữa, có lẽ trang upload của diễn đàn bị lỗi gì đó, chứ đoạn code mình post đó bị thiếu luôn cả đoạn ghi tọa độ điểm vào file bác ạ.
Khi test lisp mình đã xem kỹ rồi mà sao khi post lên lại bị vậy.
Mà cũng lạ là sao thiếu vậy mà bạn hdt4151 vẫn chạy lisp để kiểm tra được????

Mình đã sửa lại ngay trong bài post đó bác ạ.(số 2114)
Chúc bác vui.


Ah, lúc đó mình chạy lisp cũng bị lỗi nên xem file lisp trước để sửa lại ^^!

@phamthanhbinh: Hôm nay mình dùng lisp vào công việc thì phát sinh 1 lỗi (của công việc), nếu không khắc phục thì ko thể ứng dụng được :cheers: Đó là ngoài việc xuất ra (theo thứ tự) toạ độ các đỉnh của đa giác (được tạo ra bởi lệnh boundary) thì còn phải xuất ra toạ độ của các điểm (nếu có) nằm trên cạnh của đa giác đó.
Bạn giúp mình được ko :cheers:

Hình minh hoạ: http://www.cadviet.com/upfiles/3/b.dwg
  • 0