Đế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
2851 replies to this topic

#721 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 June 2011 - 07:44 AM

Bác mà search như e RL bên trên chắc chắn là lôi được nó ra mà.Không thì bác Teamview e lôi nó ra bác xem mặt mũi nó ^^
Còn đây là của em, chẳng có gì cả :

; Configuration for AutoCAD 2008 () Microsoft Windows
; C:\Users\Laptop Thuy Duong\AppData\Local\Autodesk\AutoCAD 2008\R17.1\enu\acad2008.cfg created on 5/30/2011 at 6:27:42

[AppData/all2plin]
111=0

[AppData/ArchStuff]
WallThk=8
TUngtestne=12345

[Version]
Platform=Microsoft Windows
FileVersion=8
ExecutableDate&Time=junkjunkjunkjunk

[Digitizer/Driver]
MenuName=Current System Pointing Device
PathName=internal
Configured=1

[Editor]
Link=0

[Menu]
T_Menu=0


- Còn opaque background, có lẽ CAD lưu ở đâu đó, chứ e so sánh System var trước và sau khi set Opaque không thấy có thằng nào khả nghi cả, hoặc chưa thấy ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#722 pdle

pdle

    biết lệnh mtext

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

Đã gửi 11 June 2011 - 07:42 PM

Em có hai đối tượng polyline kín. Làm sao để biết vị trí tương đối của chúng (giao nhau, rời nhau, bao nhau) ?
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#723 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 11 June 2011 - 08:12 PM

Em có hai đối tượng polyline kín. Làm sao để biết vị trí tương đối của chúng (giao nhau, rời nhau, bao nhau) ?

Hì vấn đề này hơi loằng ngoằng à.
1. Giao nhau: dùng hàm vla-intersectwith với acextendnone kết quả false là không giao nhau.
2. rời nhau bao nhiêu: Lấy đỉnh của polyline1 sét với đỉnh của polyline2 lấy trường hợp nhỏ nhất.
  • 0
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!

#724 pdle

pdle

    biết lệnh mtext

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

Đã gửi 11 June 2011 - 08:27 PM

Hì vấn đề này hơi loằng ngoằng à.
1. Giao nhau: dùng hàm vla-intersectwith với acextendnone kết quả false là không giao nhau.
2. rời nhau bao nhiêu: Lấy đỉnh của polyline1 sét với đỉnh của polyline2 lấy trường hợp nhỏ nhất.

Thế làm sao để biết là một đối tượng có nằm trong cái kia không, trong trường hợp chúng rời nhau ạ ?
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#725 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 11 June 2011 - 08:45 PM

Thế làm sao để biết là một đối tượng có nằm trong cái kia không, trong trường hợp chúng rời nhau ạ ?

Bạn tham khảo bài này: http://www.cadviet.c...showtopic=34907
  • 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!

#726 pdle

pdle

    biết lệnh mtext

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

Đã gửi 12 June 2011 - 01:26 PM

Em có mấy thắc mắc sau:
1. Có phương pháp nào giống như lệnh Boundary trong lisp không ạ?
2. Vì chưa tìm được cách nào nên em dùng (command "-boundary" ...), trong lisp để tạo ra các region bằng cách pick một điểm nào đó.
Vấn đề là ở chỗ này: Giả sử em có:
Hình đã gửi

Sau khi dùng Boundary em sẽ có 3 regions mới được tạo (nằm đè lên 3 đối tượng cũ). Em muốn bắt được các regions vừa được tạo và quản lý chúng, chẳng hạn như áp dụng các lệnh subtract, union, và xóa chúng đi sau khi xong việc, nhưng chưa nghĩ ra cách!

Mong mọi người cho ý kiến!
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#727 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 June 2011 - 02:18 PM

Cách này không chỉ đối với lệnh Boundary, mà áp dụng với mọi thao tác :
- Trước khi thực hiện thao tác, lấy entlast (1)
- Sau khi vưà thực hiện xong thao tác : Dùng vòng lặp duyệt entnext cho đến khi entnext = nil , gom chúng vào 1 list
=> Tạo được list các ename từ điểm đánh dấu 1

(setq Elast (entlast) (1)
...;Các thao tác khác
...
(while (setq Elast (entnext Elast )) (setq lstEname(cons Elast lstEname))) ;lstEname là list các đối tượng tạo ra sau điểm (1)

Chú ý điều kiện để có entlast (tức là trong bản vẽ đã có đối tượng rồi)
Hoặc tham khảo 2 hàm này trong bộ CV-utility ^^
(defun Collect(e / ent2 SS1 SS2)
;;;Selection set from e to entlast
(setq SS1 (ssadd))
(ssadd e SS1)
(while (setq ent2 (entnext e))
(ssadd ent2 SS1)
(setq e ent2)
)
(setq SS2 SS1)
)
;;;-------------------------------------------------------------------------------
(defun Collect1(e / ss)
;;;Selection set after e to entlast. If e nil, select all from fist entity of drawing.
(if (= e nil) (setq ss (collect (entnext)))
(progn (setq ss (collect e)) (ssdel e ss))
)
)

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#728 damvinhduy

damvinhduy

    biết vẽ line

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

Đã gửi 19 June 2011 - 03:39 PM

Đây là câu hỏi vô nghĩa bạn ạ, vì Khoảng cách là phải so với đâu đó. Nếu ý bạn là chiều dài nhỏ hơn 50 thì hãy iểm tra Line, nếu nó dài hơn 50 thì loại khỏi tập chọn, sau đó sssetfirst tập còn lại

Mình không biết làm thế nào để kiểm tra độ dài của đoạn thẳng đó, nếu bạn biết thì hãy chỉ cho mình.
  • 0

#729 damvinhduy

damvinhduy

    biết vẽ line

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

Đã gửi 19 June 2011 - 03:41 PM

Chom mình hỏi có lisp nào làm cho các chữ số kích thước về vị trí trung tâm(center) của đường kích thước không nhĩ. Thanks.
  • 0

#730 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 19 June 2011 - 05:29 PM

Chom mình hỏi có lisp nào làm cho các chữ số kích thước về vị trí trung tâm(center) của đường kích thước không nhĩ. Thanks.

Bạn nói rõ hơn khái niệm "centered". Nếu nó là "centered" của 2 đường dóng thì bạn dùng 2 đoạn code này:
(setvar "Dimjust" 0)
(setvar "Dimtad" 0)
Còn nếu là "centered" của chính đường kích thước (tức text nằm ngay trên chính đường kích thước) thì lại khác.
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#731 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 June 2011 - 09:21 PM

Mình không biết làm thế nào để kiểm tra độ dài của đoạn thẳng đó, nếu bạn biết thì hãy chỉ cho mình.

- Nếu bạn dùng thuần lisp thì bạn lấy mã dxf 10 và dxf 11 của đường thẳng đó , tương ứng với tọa độ điểm đầu và điểm cuối của đoạn thẳng, từ đó tính ra được chiều dài của nó.
- Nếu bạn dùng Vlisp thì truy xuất thông tin Length của nó.
Nếu gặp khó khăn gì thì bạn post tiếp nhé :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#732 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 June 2011 - 09:58 PM

Mình không biết làm thế nào để kiểm tra độ dài của đoạn thẳng đó, nếu bạn biết thì hãy chỉ cho mình.

Bạn có thể sử dụng lệnh Lentheng sau đó sử dụng biên hệ thống Perimeter để lấy chiều dài của đối tượng vừa pick
Tham khảo code

(defun c:getLen()
(command "lengthen" (car(entsel "\n Pick vao doi tuong de lay chieu dai :")) "")
(alert (strcat "Chieu dai cua doi tuong la :" (rtos (getvar "Perimeter") 2 3)))
(princ)
)

  • 0

#733 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 21 June 2011 - 10:59 PM

Mình không biết làm thế nào để kiểm tra độ dài của đoạn thẳng đó, nếu bạn biết thì hãy chỉ cho mình.

Hề hề hề,
Bạn có thể sử dụng cái củ lisp này :
 
(defun c:getLength(/ en len)
(setq len (vlax-curve-getdistatpoint (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getendpoint en)))
(princ (strcat "\n" (rtos len 2 2)))
(princ)
)

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

#734 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 22 June 2011 - 07:13 AM

Hề hề hề,
Bạn có thể sử dụng cái củ lisp này :

 
(defun c:getLength(/ en len)
(setq len (vlax-curve-getdistatpoint (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getendpoint en)))
(princ (strcat "\n" (rtos len 2 2)))
(princ)
)

Cái Lisp ni, bác Bình viết chỉ đúng với LINE, POLYLINE hở, còn các POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE thì kết quả không đúng nữa. Len = 0.0 mất.
Lý do : Các đường POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE có điểm cuối trùng với điểm đầu nên nếu bác Bình lấy endpoint thì Lisp cũng sẽ lấy Startpoint để tính. Và vì endpoint trùng Startpoint => Len = 0.0
Cái Lisp ni, Tue_NV nghĩ bác Bình sẽ sửa được
Chúc bác luôn khỏe
  • 0

#735 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 22 June 2011 - 08:17 AM

Cái Lisp ni, bác Bình viết chỉ đúng với LINE, POLYLINE hở, còn các POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE thì kết quả không đúng nữa. Len = 0.0 mất.
Lý do : Các đường POLYLINE kín, SPLINE kín ELLIPSE, CIRCLE có điểm cuối trùng với điểm đầu nên nếu bác Bình lấy endpoint thì Lisp cũng sẽ lấy Startpoint để tính. Và vì endpoint trùng Startpoint => Len = 0.0
Cái Lisp ni, Tue_NV nghĩ bác Bình sẽ sửa được
Chúc bác luôn khỏe

Chào bác Tue_VN!
Cái này dùng

(vla-get-length(vlax-ename->vla-object(car(entsel))))

Chắc là ổn chứ Bác?

Bạn có thể sử dụng lệnh Lentheng sau đó sử dụng biên hệ thống Perimeter để lấy chiều dài của đối tượng vừa pick

Đỏ: Cái này hình như Bác viết sai
  • 0
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!

#736 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 22 June 2011 - 09:12 AM

Chào bác Tue_VN!
Cái này dùng Chắc là ổn chứ Bác?
(vla-get-length(vlax-ename->vla-object(car(entsel))))
......

vla-get-length chỉ dùng đuợc cho LINE và PLINE ?

+ với arc phải dùng vla-get-ArcLength
+ với đuờng tròn dùng vla-get-Circumference
+ ellip, SpLine : pótay.

tổng quát :
- (vlax-curve-getDistAtParam (setq en (car (entsel "\n Chon doi tuong"))) (vlax-curve-getEndParam en))
  • 2

#737 codered8x

codered8x

    biết lệnh copy

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

Đã gửi 23 June 2011 - 11:13 AM

Cho mình hỏi về đoạn code này :
;;;;;;;;;;;Them tien to vao truoc ten cua tat ca cac Layer/Textstyle/Dimstyle tren ban ve
(defun c:ttt (/ Prefix)
(vl-load-com)
(while (or (initget "Layers Textstyles Dimstyles Exit")
(/= "Exit" (setq typ (cond ((getkword (strcat "\n Nhap kieu muon them tien to vao ten doi tuong Layers/Textstyles/Dimstyles/Exit <"
(setq typ (cond (typ) ("Layers"))) "> :"
)
))
(typ)
)
)
)
)
(setq Prefix (getstring (strcat "\n Nhap tien to can them vao ten cac " typ " :"))
activedocument (vla-get-activedocument (vlax-get-acad-object))
ObjectTable (cond ((= "Layers" typ) (vla-get-layers activedocument))
((= "Textstyles" typ) (vla-get-textstyles activedocument))
((= "Dimstyles" typ) (vla-get-dimstyles activedocument))
)
)
(vlax-map-collection ObjectTable 'Add_Prefix)
)
(princ "\n Done ")
(princ)
)
(defun Add_Prefix (Object)
(setq name (vla-get-name Object))
(if (not (member (strcase name t) '("0" "defpoints" "standard")))
(vla-put-name Object (strcat Prefix "." name))
)
)
Nó không làm việc với textstyles. Nguyên nhân có thể là do một số text style thuộc tính name là Real Only. Vậy làm sao để đổi được tên các style này, hoặc nếu ko đổi đc thì bỏ qua ko thực hiện với các style này ?
  • 0

#738 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 June 2011 - 02:06 PM

Nhìn code loòng thoòng quá, hay là bạn tận dụng -rename đi cho ngắn gọn dễ hiểu ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#739 codered8x

codered8x

    biết lệnh copy

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

Đã gửi 23 June 2011 - 02:29 PM

Để như thế mới dễ hiểu bạn ạ, paste vào visual lisp editor bố cục rất rõ dàng mà.
  • 0

#740 codered8x

codered8x

    biết lệnh copy

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

Đã gửi 24 June 2011 - 07:53 AM

Up, các cao thủ đâu hết rồi ?
  • 0