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

#581 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 12 November 2010 - 05:01 PM

Hì, thanks bác TueNV, em cũng chỉ cần thuật toán thôi mà
Mong mọi người giúp đỡ giải đáp thắc mắc còn lại của mình với
  • 0

#582 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 November 2010 - 09:03 PM

Hì, thanks bác TueNV, em cũng chỉ cần thuật toán thôi mà
Mong mọi người giúp đỡ giải đáp thắc mắc còn lại của mình với

Bạn dùng lisp nào up lên đây thì mới xem được chứ.
1. Ý tác giả là tính diện tích chứ không phải tạo boundary nên khi tính diện tích xong thì đã xoá boundary đi rồi.
2. pick chọn nhấm đường bao thì pick chọn lại thôi.
Nói chung là phải xem code thì trả lới mới sát được ý của bạn.
  • 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!

#583 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 13 November 2010 - 08:59 PM

CODE của nó đây bác ah :
(defun c:dd ( / tmp dtuong ds tam dsach)
(setq tong 0.00)
(while (setq a (getpoint "\nKich mot diem trong khu vuc: "))
(command "boundary" a "")
(command "area" "o" (entlast) )
(setq temp (getvar "area"))
(setq tong (+ tong temp))
)
(setq dtuong (car (entsel))
ds (entget dtuong))
(setq tong (rtos (/ tong ) 2 2))
(princ (strcat "\nDien tich la: " tong " m2"))
(foreach tam ds
(if (/= (car tam) 1)
(setq dsach (append dsach (list tam)))

(setq dsach (append dsach (list (cons 1 tong))))
)
)
(entmake dsach)
(entdel dtuong)
(princ)
);defun
;--------------------------------------------------------
Nói chung là ok, chỉ thi thoảng mới gặp phải kiểu 1 ; pick mà ko xuất hiện đường bao do lệnh Boudary tạo ra, nên có khi pick đi pick lại 1 vùng(nếu ko nhầm đã lỗi thì cái phần diện tích ấy cũng ko đúng)
Trường hợp thứ 2 là kiểu 1 vùng giao giữa các đường, chắc chắn là vùng kín, nhưng pick xong thì đường bao tạo ra lại bao ra cả các phần bên ngoài

_________________
PS : Có sử dụng được hàm foreach để duyệt danh sách ename do hàm ssget thu được ko nhỉ ?
  • 0

#584 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 November 2010 - 11:15 PM

_________________
PS : Có sử dụng được hàm foreach để duyệt danh sách ename do hàm ssget thu được ko nhỉ ?

Hề hề hề,
Câu trả lời là không Bạn à. Hàm ssget trả về một bộ chọn gồm các ename của các đối tượng chọn chứ không phải là một list các ename. Do vậy hàm foreach không có tác dụng với bộ chọn này. Nếu có tình dùng bạn sẽ có câu trả lời là bad argument.
Nếu bạn muốn sử dụng hàm foreach thì bạn có thể tạo một danh sách các ename này nhờ hàm: (acet-ss-to-list (ssget)) bạn ạ. Hoặc bạn có thể tự tạo một list mới nhờ một vòng lặp while chẳng hạn.....
Chúc bạn vui và thành công.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#585 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 14 November 2010 - 01:02 AM

He, tiện thể hỏi mọi người luôn về vấn đề này nữa :
Mình dùng một lisp tính diện tích có bản chất nằm ở lệnh Boudary, nhưng có hai lỗi gặp phải :
1- Khi pick 1 điểm trong vùng thì không thấy xuất hiện đường bao và diện tích đo được ko chính xác
2- Pick chọn nhầm đường bao mong muốn
Các cao thủ giải thích nguyên nhân hộ mình với. Thanks

Vấn đề lối của bạn là do không tạo được boundary do đường bao vẽ bằng spline... mà nó tạo thành region. Mình sửa lisp cho bạn không bị lỗi trường hợp đó rồi. Code đây. Mình có sửa thêm tí chút mong tác giả bỏ qua cho.

(defun c:dd ( / tmp dtuong ds tam dsach)
(setq tong 0.00)
(while (setq a (getpoint "\nKich mot diem trong khu vuc: "))
(command "boundary" a ""
(if (/= (getvar "cmdactive") 0)
(command "y")
)
)
(setq el1 (entlast))
(if (/= (cdr (assoc 0 (entget el1))) "REGION")
(command "region" el1 "")
)
(setq ob1 (vlax-ename->vla-object (setq el2 (entlast))))
(setq temp (vla-get-area ob1))
(setq dchen (vlax-safearray->list (vlax-variant-value (vla-get-Centroid ob1))))
(command "text" "j" "mc" dchen "" "" (strcat (rtos (/ temp 1000000.000) 2 3) " m2") "")
(setq tong (+ tong temp))
(entdel el2)
)
(setq p (getpoint "\nDiem chen ket qua"))
(setq tong (rtos (/ tong 1000000.000) 2 3))
(command "text" "j" "mc" p "" "" (strcat tong " m2") "")
(princ)
)

  • 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!

#586 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 14 November 2010 - 01:40 AM

Nói chung là ok, chỉ thi thoảng mới gặp phải kiểu 1 ; pick mà ko xuất hiện đường bao do lệnh Boudary tạo ra, nên có khi pick đi pick lại 1 vùng(nếu ko nhầm đã lỗi thì cái phần diện tích ấy cũng ko đúng)
Trường hợp thứ 2 là kiểu 1 vùng giao giữa các đường, chắc chắn là vùng kín, nhưng pick xong thì đường bao tạo ra lại bao ra cả các phần bên ngoài

Cái này là một lỗi cực kỳ khó hiểu của lệnh Boudary. Mình gặp trường hợp này khá nhiều rồi. nhất là khi bo diện tích trắc ngang của nova. Không đơn giản là do miền kín đc tạo bởi Spline như phamngoctu nói ở trên đâu. Các đối tượng được tạo ra trên trắc ngang nova hoàn toàn là 2D polyline và line nhưng vẫn cứ bị lỗi này như thường (thỉnh thoảng mới dính thôi nhé :D )
Gặp trường hợp này thì chỉ có cách là dùng lệnh fatten cho các đối tượng bao miền kín đó rồi bo lại là đc. Trong 1 vài trường hợp mình tắt 1 vài layer không liên quan cũng thấy có hiệu quả. Cực kỳ khó hiểu :iluvyousmiley:
  • 1

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


#587 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 14 November 2010 - 10:09 AM

Thấy vấn đề của mình được mọi người quan tâm, vui quá đi mất
@phamthanhbinh: Hehe, em thích duyệt các phần tử bằng foreach hơn, thế là lại biết thêm lệnh acet-ss-to-list ^^, em đã có file acet-util nhưng mà thấy ko đầy đủ các lệnh, bác có chỉ cho em có thể tham khảo cú pháp các hàm acet ở đâu được với, search trên mạng được 1 file excel khoảng vài trăm lệnh acet- nhưng mà ko biết cú pháp nên chưa mò mẫm dùng thử được bác ah
@phamngoctukst: Ý của bác Thaistreetz hoàn toàn đúng với những gì em đang thắc mắc đấy
@Thaistreetz : Hì, em cũng dùng cái này để tính diện tích trên mấy cái trắc ngang, thỉnh thoảng gặp thấy lỗi này hơi khó chịu, chưa nhìn thấy cái lệnh fatten của bác bao h cả, để em check lại phát. Thanks cả nhà :
  • 0

#588 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 14 November 2010 - 10:26 PM

Hì, hỏi mọi người nhiều quá, bắt đầu thấy ngại ngại rồi, nhưng mà dốt thì vẫn cứ phải hỏi thui, các bác ngó xem cái lisp của e sai ở đâu với :
(Defun c:VG()
(Vl-load-com)
(Setq Pl (Car(Entsel"\n Chon Pline :"))
Point (Getpoint"\n Chon diem :")
Pl (vlax-ename->vla-object Pl)
Param (Vlax-curve-getparamatpoint Pl Point)
Diem1 (Vlax-curve-getpointatparam Pl (Fix Param))
Diem2 (Vlax-curve-getpointatparam Pl (1+(Fix Param)))
Ang (+ 90(Cvunit(Angle Diem1 Diem2) "RADIANS" "DEGREES"))
Ang2 (- 180 Ang))
(Command "LINE" point(Polar Point Ang 100) "")
(Command "LINE" Point(Polar Point Ang2 50) "")
(Princ))
;------------------------------------------------------------
Nội dụng của nó là vẽ vuông góc với pline về 2 phía, 1 phía 100, 1 phía 50, cái 100 đúng còn cái 50 thì lệch, ko vuông góc với pline , chả hiểu tại sao các bác ah (check qua vài trường hợp về cái Ang2 rùi vẫn sai :iluvyousmiley:(
  • 0

#589 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 14 November 2010 - 10:44 PM

Hì, hỏi mọi người nhiều quá, bắt đầu thấy ngại ngại rồi, nhưng mà dốt thì vẫn cứ phải hỏi thui, các bác ngó xem cái lisp của e sai ở đâu với :
(Defun c:VG()
(Vl-load-com)
(Setq Pl (Car(Entsel"\n Chon Pline :"))
Point (Getpoint"\n Chon diem :")
Pl (vlax-ename->vla-object Pl)
Param (Vlax-curve-getparamatpoint Pl Point)
Diem1 (Vlax-curve-getpointatparam Pl (Fix Param))
Diem2 (Vlax-curve-getpointatparam Pl (1+(Fix Param)))
Ang (+ 90(Cvunit(Angle Diem1 Diem2) "RADIANS" "DEGREES"))
Ang2 (- 180 Ang))
(Command "LINE" point(Polar Point Ang 100) "")
(Command "LINE" Point(Polar Point Ang2 50) "")
(Princ))
;------------------------------------------------------------
Nội dụng của nó là vẽ vuông góc với pline về 2 phía, 1 phía 100, 1 phía 50, cái 100 đúng còn cái 50 thì lệch, ko vuông góc với pline , chả hiểu tại sao các bác ah (check qua vài trường hợp về cái Ang2 rùi vẫn sai :iluvyousmiley:(

Bạn sai 2 dòng này
(Command "LINE" point(Polar Point Ang 100) "")
(Command "LINE" Point(Polar Point Ang2 50) "")
hàm polar dùng góc radian không phải là degrees.
Bạn thử cái này xem
(Defun c:VG()
(Vl-load-com)
(Setq Pl (Car(Entsel"\n Chon Pline :"))
Point (Getpoint"\n Chon diem :")
Pl (acet-geom-vertex-list Pl)
Diem1 (car pl)
Diem2 (cadr pl)
Ang (+ (Angle Diem1 Diem2) (/ pi 2))
)
(Command "LINE" point (Polar Point Ang 100) "")
(Command "LINE" Point (Polar Point (+ Ang pi) 50) "")
(Princ))

  • 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!

#590 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 15 November 2010 - 01:29 AM

hàm polar dùng góc radian không phải là degrees.

Tất cả các hàm lisp dùng góc đơn vị là radian, Còn các lệnh trong cad thì dùng đơn vị Degrees
  • 1

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


#591 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 15 November 2010 - 05:16 AM

Tất cả các hàm lisp dùng góc đơn vị là radian, Còn các lệnh trong cad thì dùng đơn vị Degrees

Sao bạn "vơ đũa cả nắm" thế? Tội lắm :iluvyousmiley:
Hàm cvunit có sử dụng đơn vị Degrees cơ mà?
(CVUNIT 45 "DEGREES" "RADIAN")
  • 0

#592 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 15 November 2010 - 07:53 AM

@Tue_NV : Ui trời, chính xác là dùng Radian thật, em vừa chỉnh, chuẩn như ý luôn ^^
@ThaiStreetz : He, bác đá qua nói có 1 lời mà đụng đúng vấn đề em đang lơ mơ rồi đấy
;--------------------------------------------------------------------------------------------------
Lệnh INSERT có scale mà sao em check mã DXF của đối tượng Block insert chưa thấy nhỉ
  • 0

#593 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 16 November 2010 - 08:21 PM

Lệnh INSERT có scale mà sao em check mã DXF của đối tượng Block insert chưa thấy nhỉ

DXF 41, 42, 43 tương ứng với Scale X, Y, Z
  • 1

#594 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 17 November 2010 - 04:11 PM

Em muốn tạo file chứa Block E-CSB để thực hiện đoạn lisp này thì làm thế nào ah :
(Entmake (List(cons 0 "INSERT")(cons 2 "E-CSB")(cons 10 p51)))
;-------------------------------------------------------------------------
Với Trong bản vẽ có dimstyle với độ chính xác là 2 chữ số sau dấu phẩy (precision?) giờ em muốn chỉnh một số đối tượng lẻ về độ chính xác là 4 chữ số sau dấu phẩy, chỉnh sửa các thứ liên quan đến dimension là khá phức tạp phải ko ah?
;Edit: Đã tự trả lời được câu hỏi thứ nhất, tạo block nhét vào 1 file xong copy vào folder support của cad, đúng ko ah
  • 0

#595 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 17 November 2010 - 04:39 PM

Em muốn tạo file chứa Block E-CSB để thực hiện đoạn lisp này thì làm thế nào ah :
(Entmake (List(cons 0 "INSERT")(cons 2 "E-CSB")(cons 10 p51)))
;-------------------------------------------------------------------------
Với Trong bản vẽ có dimstyle với độ chính xác là 2 chữ số sau dấu phẩy (precision?) giờ em muốn chỉnh một số đối tượng lẻ về độ chính xác là 4 chữ số sau dấu phẩy, chỉnh sửa các thứ liên quan đến dimension là khá phức tạp phải ko ah?

Hề hề hề,
1/- Cái vụ này bạn dùng hàm entmake nghe chừng khó ổn vì block được tạo phải có các đồi tượng tạo nên nó, mà các đối tượng này lại không nằm trực tiếp trong mã dxf của block. Để đạt tới các đối tượng bên trong block phải sử dụng hàm entnext hay nentsel.....
Trên diễn đàn hình như cũng đã có lisp để tạo các block từ các đối tượng có trên bản vẽ, bạn chịu khó tìm kiếm để tham khảo nhé.
2/- Quả là chơi với thằng dimension hơi khó chịu. Nếu chỉ chỉnh sửa một vài thằng thì bạn có thể dùng modify text hoặc cũng có thể dùng lisp. Còn nếu chỉnh sửa hàng loạt thì nên chỉnh sửa dimstyle hay chỉnh biến hệ thống Dimdec.....
Hề hề hề,...
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#596 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 17 November 2010 - 05:21 PM

Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:
  • 0

#597 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 November 2010 - 08:23 PM

Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:

Bạn đã sử dụng lệnh DOV (Dimoverride) chưa?
  • 1

#598 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 17 November 2010 - 08:33 PM

Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:

Đừng nghĩ cao xa quá, rằng phải tìm hiểu DXF này nọ.... Hãy suy nghĩ như một CAD User bình thường, câu trả lời sẽ đơn giản đến bất ngờ:
(defun C:D4() (command "dimoverride" "dimdec" 4 "" (ssget) ""))
  • 3

#599 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 17 November 2010 - 09:56 PM

Cảm ơn các bác rất nhiều , thật xấu hổ là em chưa biết cái lệnh DIMOVERRIDE, chẹp, dốt nát
Em đã chỉnh theo đoạn code của bác ssg, kết quả là hoàn toàn đúng theo mong muốn ^^
  • 0

#600 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 21 November 2010 - 07:27 PM

Các bác ơi giờ muốn đóng gói đống lisp với menu và DCL thành một file cài đặt (ko biết diễn đạt đúng ko?) thì làm thế nào được ah. Em thấy nhìn cho nó có vẻ Pro hơn thôi ah
ah, mà cái phần viết DCL của Visual lisp Editor của Cad nó ko tự căn chỉnh như khi viết Lisp phải ko ah?
  • 0