Đến nội dung


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

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


  • Please log in to reply
2850 replies to this topic

#361 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 June 2009 - 05:05 PM

không phải là vla-get-ActiveDocument vì ActiveDocument là bản vẽ hiện hành, còn vla-get-Documents quản lý tất cả các bản vẽ,
chỉ có Documents mới có quyền gọi bản vẽ mới thôi chứ bản vẽ này đâu có quyền gọi bản vẽ khác.
Hai cái đó là 2 object riêng biệt.

Xin lỗi, Tôi bỏ Active nhưng vẫn báo lỗi:
error: ActiveX Server returned the error: unknown name: Document
Lisp được viết lại như sau:
(defun C:openfile	()
(setq actDoc (vla-get-Document
(vlax-get-acad-object)
)
)
(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
(vla-activate file-opened)
)

  • 0

#362 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 June 2009 - 05:10 PM

Chào thiep
Bạn copy&paste vào command line:
(vla-open (vla-get-documents (vlax-get-acad-object)) "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")
Hay

(defun c:openFile ()
(vl-load-com)
(setq docs-coll (vla-get-Documents (vlax-get-acad-object)))
; open hop thoai Select File
(setq file-to-open (getfiled "FILE TO OPEN" "" "dwg" 16))
;(setq file-to-open "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")
(setq file-opened ( vla-open docs-coll file-to-open))
(vla-activate file-opened)
)

Gia_bach, cám ơn bạn.
khi copy&paste vào command line, thì lệnh OK ngay, tuy nhiên bản vẽ chưa hiện hành
Nhưng khi tạo Lisp thì báo lỗi:
error: Automation Error. Invalid execution context
???
  • 0

#363 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 12 June 2009 - 05:26 PM

Xin lỗi, Tôi bỏ Active nhưng vẫn báo lỗi:
error: ActiveX Server returned the error: unknown name: Document
Lisp được viết lại như sau:

(defun C:openfile	()
(setq actDoc (vla-get-Document
(vlax-get-acad-object)
)
)
(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
(vla-activate file-opened)
)

Documents có s, bạn copy dưới đây :

(defun C:openfile ()
(setq docs-coll (vla-get-Documents
(vlax-get-acad-object)
)
)
(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
(vla-activate file-opened)
)
  • 1

#364 shinnikel

shinnikel

    biết vẽ line

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

Đã gửi 12 June 2009 - 11:22 PM

Bài viết của mình chưa ai xem wa thi phai ? :lol2: :lol2: :D :D
  • 0

#365 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 13 June 2009 - 12:01 PM

Documents có s, bạn copy dưới đây :

(defun C:openfile ()
(setq docs-coll (vla-get-Documents
(vlax-get-acad-object)
)
)
(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
(vla-activate file-opened)
)

Q288, cảm ơn bạn.
Thật là đôi khi cũng ngớ ngẩn vì một 1 lỗi nhỏ mà cũng không phát hiện ra.
  • 0

#366 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 16 June 2009 - 08:20 AM

Chào các bác trên diễn đàn
Các bác cho em hỏi một chút :
Đây là đoạn Code để chuyển 1 tập đối tượng chọn thành List.
Đọc Code em đã hiểu nhưng còn thắc mắc 1 chổ. Mong mọi người chỉ giúp em

;;;-----------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)
;;;-----------------------------------------------------

Đó là biến Le dòng màu đỏ. Tại sao lại có biến này nằm ở đây?
Và nó có ý nghĩa, tác dụng gì vậy?
Mong mọi người chỉ dùm em.
Em xin chân thành cảm ơn
  • 0

#367 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 16 June 2009 - 08:53 AM

Chào các bác trên diễn đàn
Các bác cho em hỏi một chút :
Đây là đoạn Code để chuyển 1 tập đối tượng chọn thành List.
Đọc Code em đã hiểu nhưng còn thắc mắc 1 chổ. Mong mọi người chỉ giúp em

;;;-----------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)
;;;-----------------------------------------------------

Đó là biến Le dòng màu đỏ. Tại sao lại có biến này nằm ở đây?
Và nó có ý nghĩa, tác dụng gì vậy?
Mong mọi người chỉ dùm em.
Em xin chân thành cảm ơn


Đó là giá trị trả về của hàm, các hàm khác sẽ nhận giá trị đó để làm tiếp công việc khác.
Td : (setq List_cac_doi_tuong (ss2ent ss))

Thông thường thì nó nằm ở cuối hàm trước dấu ) cuối cùng.
  • 1

#368 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 18 June 2009 - 05:55 PM

Các bác cho em hỏi làm cách nào để vẽ được 1 đường Pline đi qua 1 tập hợp điểm cho bởi danh sách "lstdiem" n phần tử. Mở rộng ra là cách xây dựng 1 đối tượng của Cad bằng list?Mong được các bắc giúp!
  • 0

#369 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 18 June 2009 - 07:23 PM

Các bác cho em hỏi làm cách nào để vẽ được 1 đường Pline đi qua 1 tập hợp điểm cho bởi danh sách "lstdiem" n phần tử. Mở rộng ra là cách xây dựng 1 đối tượng của Cad bằng list?Mong được các bắc giúp!


Bạn dùng kiểu như sau:

(command "pline")
(foreach i lstdiem (command i))
(command "")

Cách này nhìn không có vẻ "bác học" lắm như kết quả thì ok.
  • 2

#370 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 19 June 2009 - 08:59 AM

Đó là giá trị trả về của hàm, các hàm khác sẽ nhận giá trị đó để làm tiếp công việc khác.
Td : (setq List_cac_doi_tuong (ss2ent ss))

Thông thường thì nó nằm ở cuối hàm trước dấu ) cuối cùng.

Chào anh q288
Như vậy thì gọi chương trình con ss2ent thì kết quả sẽ trả về cái biến Le này phải không anh?
Như vậy biến Le nó đóng vai trò là kết quả của chương trình con -> Khi chương trình chính gọi nó thì nó trả về kết quả này phải không anh?
Em nói lủng củng quá. Vì em đang học Lisp nên rất cần những thông tin này. Anh trả lời hộ em câu này nhé.
Cảm ơn anh q288 và mọi người
  • 0

#371 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 19 June 2009 - 10:42 AM

Chào anh q288
Như vậy thì gọi chương trình con ss2ent thì kết quả sẽ trả về cái biến Le này phải không anh?
Như vậy biến Le nó đóng vai trò là kết quả của chương trình con -> Khi chương trình chính gọi nó thì nó trả về kết quả này phải không anh?
Em nói lủng củng quá. Vì em đang học Lisp nên rất cần những thông tin này. Anh trả lời hộ em câu này nhé.
Cảm ơn anh q288 và mọi người


Đúng rồi, muốn hàm con trả về cái gì thì để biến đó ở cuối hàm giống như Le ở trên vậy.
  • 0

#372 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 June 2009 - 10:50 AM

Chào mọi người
Tue_NV có câu hỏi này mọi người trên diễn đàn
Mình muốn hỏi về hàm entmake
-> Mình muốn xuất chữ có kiểu canh lề là Midle Center
Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.
Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

(defun c:xchu()
(setq p (getpoint))
(setq chu "123456")
(setq caochu 30)
(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))
(princ)
)

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p
Mong mọi người trên diễn đàn chỉ giúp.
Tue_NV xin cảm ơn thật nhiều
  • 0

#373 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 19 June 2009 - 11:02 AM

Chào mọi người
Tue_NV có câu hỏi này mọi người trên diễn đàn
Mình muốn hỏi về hàm entmake
-> Mình muốn xuất chữ có kiểu canh lề là Midle Center
Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.
Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

(defun c:xchu()
(setq p (getpoint))
(setq chu "123456")
(setq caochu 30)
(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))
(princ)
)

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p
Mong mọi người trên diễn đàn chỉ giúp.
Tue_NV xin cảm ơn thật nhiều

(cons 72 22)
  • 1

#374 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 June 2009 - 11:15 AM

(cons 72 22)

Cảm ơn Thiep. Mình đã thay (cons 72 2) thành (cons 72 22)
-> Kết quả là trên màn hình xuất hiện 2 điểm chèn :
1 điểm nằm ở toạ độ 0,0,0. Một điểm canh lề text ngay vị trí Text
Mình cũng không hiểu là do đâu? Nếu mình thay đổi cái điểm chèn ngay toạ độ 0,0,0 thì Text sẽ thay đổi ngay.
Mình muốn như cái Text canh lề Middle Center như bình thường, không hề muốn xuất hiện cái điểm chèn 0,0,0

Đây là Code sửa lại theo ý bạn Thiep nhưng kết quả không như ý vì lí do trên :

(defun c:xchu()
(setq p (getpoint))
(setq chu "123456")
(setq caochu 30)
(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 22) (cons 73 2)))
(princ)
)
Mong mọi người chỉ giúp cho Tue_NV
Xin cảm ơn
  • 0

#375 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 19 June 2009 - 11:20 AM

Chào mọi người
Tue_NV có câu hỏi này mọi người trên diễn đàn
Mình muốn hỏi về hàm entmake
-> Mình muốn xuất chữ có kiểu canh lề là Midle Center
Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.
Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

(defun c:xchu()
(setq p (getpoint))
(setq chu "123456")
(setq caochu 30)
(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))
(princ)
)

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p
Mong mọi người trên diễn đàn chỉ giúp.
Tue_NV xin cảm ơn thật nhiều


Bạn thêm (cons 11 p) nữa. Vì chỉ có align Left là dùng dxf code 10 thôi (code 11 khi đó là '(0 0 0))
còn các align khác thì code 11 là chính còn 10 là phụ.
Bạn cứ cho cả 2 code 10 và 11 bằng p hết đi, cad sẽ tự động tính lại code 10.
  • 2

#376 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 June 2009 - 11:29 AM

Bạn thêm (cons 11 p) nữa. Vì chỉ có align Left là dùng dxf code 10 thôi (code 11 khi đó là '(0 0 0))
còn các align khác thì code 11 là chính còn 10 là phụ.
Bạn cứ cho cả 2 code 10 và 11 bằng p hết đi, cad sẽ tự động tính lại code 10.

Cảm ơn q288. Tue_NV đã hiểu rồi. Bây giờ mình có thể giúp cho bạn xuantran hoàn thành 1 đoạn Lisp đo góc bên Topic Viết Lisp theo yêu cầu rồi
Một lần nữa cảm ơn bạn q288 :lol2:
  • 0

#377 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 20 June 2009 - 10:47 AM

Bạn dùng kiểu như sau:

(command "pline")
(foreach i lstdiem (command i))
(command "")

Cách này nhìn không có vẻ "bác học" lắm như kết quả thì ok.

Cám ơn bác q288 đã hướng dẫn. Nhờ bác trả lời vế sau của e luôn được chứ?
E đã thử lấy giá trị của hàm (entget doituong) để thử tạo ra 1 đổi tượng mới nhưng ko thành công.
Cụ thể như sau: lấy "entget" của đường Pline (4 điểm) được:
((-1 . ) (0 . LWPOLYLINE) (330 .
) (5 . 189800) (100 . AcDbEntity) (67 . 0) (410 . Model)
(8 . 2) (100 . AcDbPolyline) (90 . 4) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0)
(10 233.688 -392.403) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 258.958 -374.806)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 269.721 -385.148) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (10 285.425 -375.227) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0
1.0))
Từ đây e thử tạo tại Pline này bằng lệnh entmake nhưng ko được.Bác q288 xem ý tưởng vậy có gì sai?
  • 0

#378 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 20 June 2009 - 11:04 AM

Cám ơn bác q288 đã hướng dẫn. Nhờ bác trả lời vế sau của e luôn được chứ?
E đã thử lấy giá trị của hàm (entget doituong) để thử tạo ra 1 đổi tượng mới nhưng ko thành công.
Cụ thể như sau: lấy "entget" của đường Pline (4 điểm) được:
((-1 . ) (0 . LWPOLYLINE) (330 .
) (5 . 189800) (100 . AcDbEntity) (67 . 0) (410 . Model)
(8 . 2) (100 . AcDbPolyline) (90 . 4) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0)
(10 233.688 -392.403) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 258.958 -374.806)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 269.721 -385.148) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (10 285.425 -375.227) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0
1.0))
Từ đây e thử tạo tại Pline này bằng lệnh entmake nhưng ko được.Bác q288 xem ý tưởng vậy có gì sai?

Bạn chú ý có một số mã DXF chỉ duy nhất với 1 đối tượng (giống như mã sinh viên thì không được phép của ai trùng của ai dù là anh em sinh đôi giống nhau như đúc). Ví dụ như mã Handle (-5) , ... bạn đọc lại sách xem
  • 1

#379 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 20 June 2009 - 01:48 PM

Cám ơn bác q288 đã hướng dẫn. Nhờ bác trả lời vế sau của e luôn được chứ?
E đã thử lấy giá trị của hàm (entget doituong) để thử tạo ra 1 đổi tượng mới nhưng ko thành công.
Cụ thể như sau: lấy "entget" của đường Pline (4 điểm) được:
((-1 . ) (0 . LWPOLYLINE) (330 .
) (5 . 189800) (100 . AcDbEntity) (67 . 0) (410 . Model)
(8 . 2) (100 . AcDbPolyline) (90 . 4) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0)
(10 233.688 -392.403) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 258.958 -374.806)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 269.721 -385.148) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (10 285.425 -375.227) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0
1.0))
Từ đây e thử tạo tại Pline này bằng lệnh entmake nhưng ko được.Bác q288 xem ý tưởng vậy có gì sai?


Bạn dùng entmake thì vất vả đấy, vì phải hiểu rõ các code của nó mới làm đc.
Bạn viết lại như sau:

(entmake '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline")
(90 . 4) (70 . 0)
(10 233.688 -392.403)
(42 . 0) (10 258.958 -374.806)
(42 . 0) (10 269.721 -385.148)
(42 . 0) (10 285.425 -375.227)
))
  • 0

#380 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 20 June 2009 - 02:50 PM

Có những code cad chỉ cho bạn "ngó" thôi chứ không cho bạn đụng tới như code -1, 330, 5 .Do đó bạn không thể bê
nguyên xi cái entget của đối tượng này để entmake đtg khác đc.
Những code mình đưa ra ở trên là những code tối thiểu đủ để tạo đtg pline. (code 70 bỏ cũng đc)
  • 1