Đến nội dung


Hình ảnh
- - - - -

Hỏi về thông tin của Spline và một số hàm VL..,Vlax..


  • Please log in to reply
40 replies to this topic

#21 dangbaoduy1982

dangbaoduy1982

    biết zoom

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

Đã gửi 16 August 2009 - 03:47 PM

Tiện đây cũng hỏi luôn xem có bạn nào có ct hay hàm nào nhận biết đc một đoạn trong pline là thẳng hay cong ko?


Đây là dữ liệu của một đường PL gồm một đoạn thẳng và một đoạn cong. Chú ý rằng mỗi đỉnh PL đều có mã DXF 42. Nếu giá trị mã này khác 0 thì phân đoạn ngay sau đỉnh đó là đoạn cong.
((-1 . ) (0 . LWPOLYLINE) (330 . 7ef69cf8>) (5 . 224F32) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 .
CAODODAYCONG) (100 . AcDbPolyline) (90 . 3) (70 . 0) (43 . 0.0) (38 . 0.0) (39
. 0.0) (10 2391.15 -3135.52) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2464.21
-3061.75) (40 . 0.0) (41 . 0.0) (42 . -0.475185) (10 2609.54 -3075.87) (40 .
0.0) (41 . 0.0) (42 . 1.92085) (210 0.0 0.0 1.0))

Lệnh truy cập dữ liệu của một đối tượng:
;Ham xem du lieu doi tuong phuc
(defun C:OBDT(/ ent)
(setq ent (car(entsel "Chon doi tuong phuc : ")))
(princ "\n")
(while (/= (cdr(assoc 0 (entget ent))) "SEQEND")
(princ (entget ent))
(setq ent(entnext ent))
(princ "\n")
)
(princ (entget ent))(princ)
)
;Truy du lieu doi tuong
(defun C:OBDT1(/ ent)
(setq ent (car(entsel "Chon doi tuong : ")))
(princ "\n")
(princ (entget ent))
(princ)
)
  • 0

#22 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 16 August 2009 - 06:17 PM

Chào bác Hoành và mọi người trên diễn đàn

Tue_NV đã xem qua các ví dụ trong Help. Nhưng các ví dụ trong Help quá ít.
Nếu có thể, bác Hoành và mọi người có thể cho 1 ví dụ nho nhỏ thôi để mình có thể hiểu thêm một chút về mảng safearray và vấn đề lý giải trên của bác Hoành

Tue_NV xin cảm ơn nhiều lắm.

Bạn tham khảo bài viết về mảng trên afralisp.net
hoặc Selection Objects phần Selecting with Filters
  • 1

#23 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 September 2009 - 07:57 AM

Bạn tham khảo bài viết về mảng trên afralisp.net
hoặc Selection Objects phần Selecting with Filters

Cảm ơn anh gia bách rất nhiều. Anh cho Tue_NV hỏi thêm là khi thao tác qua ActiveX với method, cụ thể là Getpoint Method có 1 chổ mà Tue_NV không hiểu và không sao làm được đó là cấu trúc và cú pháp của Getpoint Method

RetVal = GetPoint([Point][, Prompt])

Object

Utility
The object or objects this method applies to.

Point

Variant (three-element array of doubles); input-only; optional
The 3D WCS coordinates specifying the relative base point.

Prompt

Variant (string); input-only; optional
The text used to prompt the user for input.

RetVal

Variant (three-element array of doubles)
The 3D WCS coordinates of the point the AutoCAD user has selected.

Mình đã viết như sau : (vla-getpoint '(0 0 0) "\n Nhap point :")
và mình hiểu rằng điều đó là sai vì chưa hiểu đúng và đầy đủ định nghĩa là Varriant

Mong anh giabach và mọi người chỉ giúp và có thể cho 1 ví dụ nhỏ thôi về cái này để Tue_NV có thể hiểu hơn 1 chút về Activex
Cảm ơn anh giabach cùng mọi người.
  • 0

#24 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 07 September 2009 - 08:51 AM

cấu trúc và cú pháp của Getpoint Method
RetVal = GetPoint([Point][, Prompt])

Chào Tue_NV
Bạn có thể tham khảo ví dụ duới đây về vla-getpoint (vla-addline).
(defun c:test (/ doc Util pt1 pt2)
(vl-load-com)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
Util (vla-get-utility doc))

(setq pt1 (vla-getpoint Util nil "\nDiem dau : "))
(setq pt2 (vla-getpoint Util pt1 "\nDiem cuoi : "))
; ve Line
(vla-addline (vla-get-ModelSpace doc) pt1 pt2)
)

  • 1

#25 thiep

thiep

    biết dimbaseline

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

Đã gửi 08 September 2009 - 10:38 AM

Đây là dữ liệu của một đường PL gồm một đoạn thẳng và một đoạn cong. Chú ý rằng mỗi đỉnh PL đều có mã DXF 42. Nếu giá trị mã này khác 0 thì phân đoạn ngay sau đỉnh đó là đoạn cong.
((-1 . ) (0 . LWPOLYLINE) (330 . 7ef69cf8>) (5 . 224F32) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 .
CAODODAYCONG) (100 . AcDbPolyline) (90 . 3) (70 . 0) (43 . 0.0) (38 . 0.0) (39
. 0.0) (10 2391.15 -3135.52) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2464.21
-3061.75) (40 . 0.0) (41 . 0.0) (42 . -0.475185) (10 2609.54 -3075.87) (40 .
0.0) (41 . 0.0) (42 . 1.92085) (210 0.0 0.0 1.0))

Lệnh truy cập dữ liệu của một đối tượng:
;Ham xem du lieu doi tuong phuc
(defun C:OBDT(/ ent)
(setq ent (car(entsel "Chon doi tuong phuc : ")))
(princ "\n")
(while (/= (cdr(assoc 0 (entget ent))) "SEQEND")
(princ (entget ent))
(setq ent(entnext ent))
(princ "\n")
)
(princ (entget ent))(princ)
)
;Truy du lieu doi tuong
(defun C:OBDT1(/ ent)
(setq ent (car(entsel "Chon doi tuong : ")))
(princ "\n")
(princ (entget ent))
(princ)
)

Cách của dangbaoduy1982 không hay bằng hàm này đâu. Đó là hàm (vla-getbulge object index), hàm sẽ trả về độ lồi của đoạn cong trên polyline. G288 tạo vòng lặp với n là số node, khi nào (vla-getbulge object index) /= 0 có nghĩa là tại index đó có đoạn cong (arc)
Từ lâu, thiep đã biết hàm này, bây giờ thiep mới reply, không biết có muộn màng không?
  • 1

#26 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 September 2009 - 11:07 AM

Cách của dangbaoduy1982 không hay bằng hàm này đâu. Đó là hàm (vla-getbulge object index), hàm sẽ trả về độ lồi của đoạn cong trên polyline. G288 tạo vòng lặp với n là số node, khi nào (vla-getbulge object index) /= 0 có nghĩa là tại index đó có đoạn cong (arc)
Từ lâu, thiep đã biết hàm này, bây giờ thiep mới reply, không biết có muộn màng không?

Chào thiep
Mọi sự chia sẻ kiến thức và kinh nghiệm cho nhau không bao giờ là muộn màng cả và điều đó vô cùng đáng quý.
Nếu có thể Thiep có thể vui lòng cho Tue_NV thêm 1 ví dụ về hàm này được không?
Thanks
  • 0

#27 dangbaoduy1982

dangbaoduy1982

    biết zoom

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

Đã gửi 08 September 2009 - 11:42 AM

Cách của dangbaoduy1982 không hay bằng hàm này đâu. Đó là hàm (vla-getbulge object index), hàm sẽ trả về độ lồi của đoạn cong trên polyline. G288 tạo vòng lặp với n là số node, khi nào (vla-getbulge object index) /= 0 có nghĩa là tại index đó có đoạn cong (arc)
Từ lâu, thiep đã biết hàm này, bây giờ thiep mới reply, không biết có muộn màng không?


Cảm ơn bạn Thiep, mình sẽ ứng dụng hàm này vào công việc của mình. Chắc là bạn đã biết rồi nhưng mình nói luôn ý nghĩa tham số độ cong:
Là tỷ số giữa chiều đoạn thẳng nối hai trung điểm dây cung và cung tròn và chiều dài 1/2 dây cung đó. Nếu giá trị độ cong >0 : cung tròn polyline theo ngược chiều kim đồng hồ, ngược lại cùng chiều kim đồng hồ.
  • 1

#28 thiep

thiep

    biết dimbaseline

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

Đã gửi 08 September 2009 - 12:00 PM

Chào thiep
Mọi sự chia sẻ kiến thức và kinh nghiệm cho nhau không bao giờ là muộn màng cả và điều đó vô cùng đáng quý.
Nếu có thể Thiep có thể vui lòng cho Tue_NV thêm 1 ví dụ về hàm này được không?
Thanks

Chào Tue_NV, đây là 1 đoạn mã lisp dùng để xác định trên 1 LWPOLYLINE hay POLYLINE có đoạn arc hay không:
(defun c:bul (/ obj n i bul)
(setq obj (vlax-ename->vla-object (car (entsel "\nPick a polyline")))
n (fix (vlax-curve-getEndParam obj))
i 0
)
(terpri)
(repeat n
(setq bul (vla-getbulge obj i))
(if (/= bul 0)
(progn
(princ (Strcat "Tai vi tri node "
(itoa i)
" co 1 arc voi do cong la: "
(rtos bul 2 3) "\n"
)
)
(terpri)
)
)
(setq i (1+ i))
)
(princ)
(textscr)
)



Cảm ơn bạn Thiep, mình sẽ ứng dụng hàm này vào công việc của mình. Chắc là bạn đã biết rồi nhưng mình nói luôn ý nghĩa tham số độ cong:
Là tỷ số giữa chiều đoạn thẳng nối hai trung điểm dây cung và cung tròn và chiều dài 1/2 dây cung đó. Nếu giá trị độ cong >0 : cung tròn polyline theo ngược chiều kim đồng hồ, ngược lại cùng chiều kim đồng hồ.

Cảm ơn dangbaoduy1982, lâu nay Thiep cứ ngờ ngợ độ cong này là tan của 1 góc nào đó, bây giờ nhờ dangbaoduy1982 mình mới hiểu được tham số này.
Nhân tiện, cho Thiep hỏi, các anh em nào hiểu rõ về hàm vlax-curve-getSecondDeriv như thế nào không ạ? Thiep nghĩ nó là giá trị đạo hàm bậc 2 tại 1 điểm trên Curve có phải không? Ứng dụng nó như thế nào? Nếu được cho mình 1 ví dụ.
  • 0

#29 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 11 September 2009 - 04:15 PM

Chào Tue_NV, đây là 1 đoạn mã lisp dùng để xác định trên 1 LWPOLYLINE hay POLYLINE có đoạn arc hay không:

(defun c:bul (/ obj n i bul)
(setq obj (vlax-ename->vla-object (car (entsel "\nPick a polyline")))
n (fix (vlax-curve-getEndParam obj))
i 0
)
(terpri)
(repeat n
(setq bul (vla-getbulge obj i))
(if (/= bul 0)
(progn
(princ (Strcat "Tai vi tri node "
(itoa i)
" co 1 arc voi do cong la: "
(rtos bul 2 3) "\n"
)
)
(terpri)
)
)
(setq i (1+ i))
)
(princ)
(textscr)
)

Cảm ơn dangbaoduy1982, lâu nay Thiep cứ ngờ ngợ độ cong này là tan của 1 góc nào đó, bây giờ nhờ dangbaoduy1982 mình mới hiểu được tham số này.
Nhân tiện, cho Thiep hỏi, các anh em nào hiểu rõ về hàm vlax-curve-getSecondDeriv như thế nào không ạ? Thiep nghĩ nó là giá trị đạo hàm bậc 2 tại 1 điểm trên Curve có phải không? Ứng dụng nó như thế nào? Nếu được cho mình 1 ví dụ.

Đúng vậy, vlax-curve-getSecondDeriv là giá trị đạo hàm bậc 2 tại 1 điểm trên Curve.
Nó là vector nối từ điểm trên curve tới tâm cong, độ dài vector là bán kính cong tại điểm đó.
Trong cơ học, gia tốc hướng tâm a=v^2/r
Trong thiết kế mặt đường, từ r, v thiết kế => độ dốc siêu cao
  • 3

#30 dangbaoduy1982

dangbaoduy1982

    biết zoom

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

Đã gửi 11 September 2009 - 09:17 PM

Nhân tiện, cho Thiep hỏi, các anh em nào hiểu rõ về hàm vlax-curve-getSecondDeriv như thế nào không ạ? Thiep nghĩ nó là giá trị đạo hàm bậc 2 tại 1 điểm trên Curve có phải không? Ứng dụng nó như thế nào? Nếu được cho mình 1 ví dụ.


Bạn hãy test hàm này, mình tìm trên mạng. Khi test hãy chọn cung tròn hoặc cung tròn polyline


(defun c:drawradius(/ ename pt1 curveobj deriv2 pt2)
(mapcar 'set '(ename pt1) (entsel))
(setq curveobj (vlax-ename->vla-object ename))
(setq pt1 (VLAX-CURVE-GETCLOSESTPOINTTO curveobj pt1))
(setq deriv2 (vlax-curve-getSecondDeriv
curveobj
(vlax-curve-getParamAtPoint curveobj pt1)
))
(setq pt2 (mapcar '+ pt1 deriv2))
(vlax-invoke
(vla-ObjectIDToObject
(vla-get-document curveobj)
(vla-get-OwnerID curveobj))
'addline pt1 pt2)
)

  • 2

#31 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 September 2009 - 05:12 AM

Cảm ơn anh giabach rất nhiều.
Anh gia_bach và mọi người cho Tue_NV hỏi thêm về Addvertex-Method
Tue_NV đã viết code như sau :

(defun c:addvertex (/ doc Util pt1 obj)
(vl-load-com)
(setq obj (vlax-ename->vla-object(car(entsel "\n Pick chon PLINE :"))))

(setq doc (vla-get-activeDocument (vlax-get-acad-object))
Util (vla-get-utility doc))

(setq pt1 (vla-getpoint Util nil "\nDiem them node : "))
(vla-addvertex obj 1 pt1)
(princ)
)

-> Kết quả báo lỗi :
; error: Automation Error. Incorrect number of elements in SafeArray

Tue_NV nghĩ rằng lỗi này là do : sự không hợp lý về số của phần tử trong mảng.
Không biết Tue_NV hiểu như thế có đúng không? Cách sửa lại đoạn code thì mình chưa tỏ tường lắm.
Mong anh gia_bach và mọi người chỉ giúp. Tue_NV xin cảm ơn
  • 0

#32 dangbaoduy1982

dangbaoduy1982

    biết zoom

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

Đã gửi 15 September 2009 - 08:57 AM

Cảm ơn anh giabach rất nhiều.
Anh gia_bach và mọi người cho Tue_NV hỏi thêm về Addvertex-Method
Tue_NV đã viết code như sau :

(defun c:addvertex (/ doc Util pt1 obj)
(vl-load-com)
(setq obj (vlax-ename->vla-object(car(entsel "\n Pick chon PLINE :"))))

(setq doc (vla-get-activeDocument (vlax-get-acad-object))
Util (vla-get-utility doc))

(setq pt1 (vla-getpoint Util nil "\nDiem them node : "))
(vla-addvertex obj 1 pt1)
(princ)
)

-> Kết quả báo lỗi :
; error: Automation Error. Incorrect number of elements in SafeArray

Tue_NV nghĩ rằng lỗi này là do : sự không hợp lý về số của phần tử trong mảng.
Không biết Tue_NV hiểu như thế có đúng không? Cách sửa lại đoạn code thì mình chưa tỏ tường lắm.
Mong anh gia_bach và mọi người chỉ giúp. Tue_NV xin cảm ơn


Bạn nghiên cứu đoạn mã này:

(defun AddVertice(/)
(setq Ent1Name (car (entsel "\nSeleccione una LwPolyline ")))
(setq objPl (vlax-ename->vla-object Ent1Name)
index nil
index2 nil)
(command "_osnap" "_nea")
(while
(setq pt1 (getpoint "\nSeleccione el punto a ingresar a la Lwpolyline "))
(setq pt1 (reverse pt1))
(setq Pt1XY (cdr pt1))
(setq pt1XY (reverse Pt1XY))
(setq saPt1 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
(vlax-safearray-fill saPt1 Pt1XY)
(tramo)
(vla-addvertex objPl index2 saPt1)
)
(command "_osnap" "_none")
(setvar "cmdecho" 1)
(princ)
)

(defun tramo (/ coords uno dos cnt)
(setq coords (vlax-safearray->list (vlax-variant-value (vla-get-coordinates objPl)))
uno (car coords)
dos (cadr coords)
coords (append coords (list uno))
coords (append coords (list dos))
cnt 0
)
(repeat (1- (/ (length coords) 2))
(if (equal (angle (list (car coords) (cadr coords)) pt1XY) (angle (list (car coords) (cadr coords)) (list (caddr coords) (cadddr coords))) 1e-06)
(setq index cnt
index2 (1+ index)
)
)
(setq coords (cddr coords)
cnt (1+ cnt)
)
)
)

(defun Nuevo()
(setq Ent1Name (car (entsel "\nSeleccione una LwPolyline base para el nuevo poligono ")))
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
mspace (vla-get-modelspace doc)
objPl (vlax-ename->vla-object Ent1Name)
coords (vlax-safearray->list (vlax-variant-value (vla-get-coordinates objPl)))
temporal coords
cnt 0
ptin '()
)
(repeat (/ (length coords) 2)
(setq este (car coords)
norte (cadr coords)
ptin (list este norte)
)
(setq mypunto (vla-addPoint mspace (vlax-3d-point ptin)))
(vla-put-layer mypunto "Ptemp")
(setq coords (cddr coords)
cnt (1+ cnt)
)
)
(prompt "\nSeleccione los vertices del nuevo poligono ")
(setq puntos (ssget'((0 . "Point")(8 . "Ptemp")))
num (sslength puntos)
cont 0
nnpt '()
)
(repeat num
(setq coorpt (cdr (assoc 10 (entget (ssname puntos cont))))
nnpt (append nnpt (list (car coorpt)))
nnpt (append nnpt (list (cadr coorpt)))
cont (1+ cont)
)
)
(setq listann '()
nnpt2 nnpt
)
(repeat (/ (length temporal) 2)
(setq ptpl (list (car temporal)(cadr temporal))
)
(repeat (/ (length nnpt2))
(setq ptnn (list (car nnpt2)(cadr nnpt2))
)
(if (equal ptpl ptnn)
(setq listann (append listann ptnn))
)
(setq nnpt2 (cddr nnpt2))
)
(setq temporal (cddr temporal)
nnpt2 nnpt
)
)
(if (= (rem (length listann) 2) 0)
(progn
(setq
tmp (vlax-make-safearray
vlax-vbDouble
(cons 0 (- (length listann) 1))
)
)
(vlax-safearray-fill tmp listann)
(setq myobj (vla-AddLightweightPolyline mspace tmp))
(vla-put-closed myobj :vlax-true)
(vla-put-layer myobj "NuevoPol")
(vla-delete objpl)
)
(princ "\nerror: La polylinea no pudo ser creada")
)
(setq puntos (ssget "_x" '((0 . "Point")(8 . "Ptemp")))
num (sslength puntos)
cont 0
)
(repeat num
(setq puntodel (ssname puntos cont)
)
(entdel puntodel)
(setq cont (1+ cont)
)
)
(setvar "cmdecho" 1)
(princ)
)

(defun c:cpol (/ *osmode*)
(vl-load-com)
(PROMPT "\nPrograma para agregar o eliminar vertices de una Lwpolyline")
(setvar "cmdecho" 0)
(setq *osmode* (getvar "osmode")
capa (getvar "clayer")
)
(command "_layer" "_m" "NuevoPol" "_c" "1" "" "")
(command "_layer" "_m" "Ptemp" "_c" "2" "" "")
(setvar "osmode" 0)
(command "_undo" "_begin")
(INITGET 0 "1 2")
(SETQ S (GETKWORD "\nSeleccionar una opcion: 1=>Agregar 2=>Eliminar vertices :"))
(WHILE (/= S NIL)
(COND
((= S "1") (addvertice))
((= S "2") (nuevo))
((= S NIL) (SETQ S NIL))
)
(INITGET 0 "1 2")
(SETQ S (GETKWORD "\nSeleccionar una opcion: 1=>Agregar 2=>Eliminar vertices :"))
)
(command "_undo" "_end")
(setvar "osmode" *osmode*)
(setvar "clayer" capa)
(setvar "cmdecho" 1)
(prin1)
)

  • 1

#33 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 15 September 2009 - 09:23 AM

........
mọi người cho Tue_NV hỏi thêm về Addvertex-Method
........sự không hợp lý về số của phần tử trong mảng.

Chào Tue_NV

Về tham số Index trong hàm Addvertex
Index : The index in the array of vertices where the vertex is to be added. Index must be a positive integer. The first element of the array is index 0.
tạm dịch : Index là chỉ số thứ tự của đỉnh nơi đỉnh mới đuợc thêm vào. Index phải là số nguyên duơng. Chỉ số đầu tiên của Index là 0.

Các buớc thực hiện :
1. xác định thông số Param của Pline tại diểm Pt cần thêm đỉnh
- (setq ParamPt (vlax-curve-getParamAtPoint obj pt)) : t/hợp Pt thuộc Pline
- (setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) )) : : t/hợp Pt không thuộc Pline

2. Tính chỉ số Index của đỉnh truớc vị trí Pt : (fix ParamPt)

3. Do đó chỉ số Index của đỉnh cần thêm tại vị trí Pt : (1+ (fix ParamPt))

4. gọi hàm Addvertex : (vla-addvertex obj (1+ (fix ParamPt)) Pt)

Chú ý : hàm Addvertex chỉ thêm 1 segment mới truớc vị trí Pt có kiểu là Đuờng thẳng (LINE segment).
Để thêm phần tử Cung tròn (ARC segment), truớc tiên thêm 1 line segment, sau đó add thuộc tính "bulge" (tạm dịch : độ lồi lõm của Curve) bằng hàm SetBulge : (vla-setBulge obj Index Value)

Minh họa hàm AddVertex
- Lisp chỉ thêm p/tử Đuờng thẳng, không xét đến t/hợp chèn đỉnh tại phần tử Cung tròn. Các bạn có thể bổ sung phần này.
- về dòng (vlax-invoke obj 'AddVertex ...) : vlax-invoke là 1 cách khác để gọi hàm VLA
- để thấy rõ hình ảnh các đỉnh khi thêm vào, hãy chọn đối tuợng truớc khi gọi lệnh AddVertex
(defun c:AddVertex (/ sel obj pt ParamPt)
(if
(and
(setq sel (entsel "\n Chon Polyline can them Node : "))
(= (cdr (assoc 0 (entget (car sel)))) "LWPOLYLINE")
(setq obj (vlax-ename->vla-object (car sel)))
)
(while (setq pt (getpoint "\n Chon vi tri can them Node : "))
(or
(setq ParamPt (vlax-curve-getParamAtPoint obj pt))
(setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) ))
)
(if (> (- ParamPt (fix ParamPt)) 0.001); bo qua t/hop diem Pt trung voi dinh cua PLINE
(vlax-invoke obj 'AddVertex (1+ (fix ParamPt)) (list (car pt) (cadr pt)))
)
)
)
(princ)
)

  • 1

#34 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 September 2009 - 05:10 AM

Chào Tue_NV
Về tham số Index trong hàm Addvertex
Index : The index in the array of vertices where the vertex is to be added. Index must be a positive integer. The first element of the array is index 0.
tạm dịch : Index là chỉ số thứ tự của đỉnh nơi đỉnh mới đuợc thêm vào. Index phải là số nguyên duơng. Chỉ số đầu tiên của Index là 0.

Các buớc thực hiện :
1. xác định thông số Param của Pline tại diểm Pt cần thêm đỉnh
- (setq ParamPt (vlax-curve-getParamAtPoint obj pt)) : t/hợp Pt thuộc Pline
- (setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) )) : : t/hợp Pt không thuộc Pline

2. Tính chỉ số Index của đỉnh truớc vị trí Pt : (fix ParamPt)

3. Do đó chỉ số Index của đỉnh cần thêm tại vị trí Pt : (1+ (fix ParamPt))

4. gọi hàm Addvertex : (vla-addvertex obj (1+ (fix ParamPt)) Pt)

Chào anh gia_bach.
Cảm ơn anh rất nhiều. Code của anh chạy tuyệt vời

Theo sự hướng dẫn của anh, em đã gọi hàm vla-addvertex theo bước thứ 4 thay thế hàm (vlax-invoke obj 'AddVertex ...)
Nhưng không thành công -> Kết quả báo lỗi : ; error: lisp value has no coercion to VARIANT with this type: (12.4092 12.2271 0.0)
Đây là đoạn Code mà Tue_NV đã thay :

(defun c:AddVertex (/ sel obj pt ParamPt)
(if
(and
(setq sel (entsel "\n Chon Polyline can them Node : "))
(= (cdr (assoc 0 (entget (car sel)))) "LWPOLYLINE")
(setq obj (vlax-ename->vla-object (car sel)))
)
(while (setq pt (getpoint "\n Chon vi tri can them Node : "))
(or
(setq ParamPt (vlax-curve-getParamAtPoint obj pt))
(setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) ))
)
(if (> (- ParamPt (fix ParamPt)) 0.001); bo qua t/hop diem Pt trung voi dinh cua PLINE
(vla-addvertex obj (1+ (fix ParamPt)) Pt)
)
)
)
(princ)
)


Command: addvertex
Chon Polyline can them Node :
Chon vi tri can them Node :
; error: lisp value has no coercion to VARIANT with this type: (12.4092 12.2271 0.0)

THiết nghĩ rằng đây là lỗi về tham số Point trong hàm vla-addvertex

Point
Variant (three-element array of doubles); input-only
The 3D OCS coordinates at which to create the new vertex

Vì chưa hiểu đầy đủ và đúng bản chất của tham số point trong hàm vla-addvertex nên Tue_NV chưa biết
cách khắc phục được. Anh gia_bach và mọi người chỉ dùm cho Tue_NV với. Nó bí rị, khó chịu quá chừng :s_big:
Cảm ơn anh gia_bach và mọi người
  • 0

#35 thiep

thiep

    biết dimbaseline

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

Đã gửi 16 September 2009 - 09:50 AM

Chào anh gia_bach.
Cảm ơn anh rất nhiều. Code của anh chạy tuyệt vời

Theo sự hướng dẫn của anh, em đã gọi hàm vla-addvertex theo bước thứ 4 thay thế hàm (vlax-invoke obj 'AddVertex ...)
Nhưng không thành công -> Kết quả báo lỗi : ; error: lisp value has no coercion to VARIANT with this type: (12.4092 12.2271 0.0)
Đây là đoạn Code mà Tue_NV đã thay :

(defun c:AddVertex (/ sel obj pt ParamPt)
(if
(and
(setq sel (entsel "\n Chon Polyline can them Node : "))
(= (cdr (assoc 0 (entget (car sel)))) "LWPOLYLINE")
(setq obj (vlax-ename->vla-object (car sel)))
)
(while (setq pt (getpoint "\n Chon vi tri can them Node : "))
(or
(setq ParamPt (vlax-curve-getParamAtPoint obj pt))
(setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) ))
)
(if (> (- ParamPt (fix ParamPt)) 0.001); bo qua t/hop diem Pt trung voi dinh cua PLINE
(vla-addvertex obj (1+ (fix ParamPt)) Pt)
)
)
)
(princ)
)


Vì chưa hiểu đầy đủ và đúng bản chất của tham số point trong hàm vla-addvertex nên Tue_NV chưa biết
cách khắc phục được. Anh gia_bach và mọi người chỉ dùm cho Tue_NV với. Nó bí rị, khó chịu quá chừng :s_big:
Cảm ơn anh gia_bach và mọi người

Chào Tue_NV, lỗi trên do khai báo tọa độ point, bạn phải thêm vlax-3d-point thành (vla-addvertex obj (1+ (fix ParamPt)) (vlax-3d-point Pt))
Trong VL, các tọa độ point phải khai báo nằm trong mảng safearray.
Ví dụ tạo 1 line:
(setq P1 (getpoint "pick point 1")
P2 (getpoint "pick point 2")
)
(vla-addline *Model*
(vlax-3d-point P1)
(vlax-3d-point P2)
)
  • 1

#36 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 16 September 2009 - 10:44 AM

về Addvertex-Method

-> Kết quả báo lỗi :
; error: Automation Error. Incorrect number of elements in SafeArray

Tue_NV nghĩ rằng lỗi này là do : sự không hợp lý về số của phần tử trong mảng.

; error: lisp value has no coercion to VARIANT with this type: (12.4092 12.2271 0.0)

THiết nghĩ rằng đây là lỗi về tham số Point trong hàm vla-addvertex

Point
Variant (three-element array of doubles); input-only
The 3D OCS coordinates at which to create the new vertex


Sorry Tue_NV vì chuyện hỏi một đàng trả lời một nẻo.

Về tham số Point trong hàm Addvertex
- Point : Variant (three-element array of doubles) 3D Variant
mặc dù trong HELP cho là 3D Variant nhưng thực chất là hàm Addvertex chỉ chấp nhận tham số Point với kiểu 2D Variant :s_big:
(Thực tế khi xem các mã DXF của LWPOLYLINE, thông tin các đỉnh cũng đuợc lưu với kiểu 2D, thông tin cao độ Z (Elevation) đuợc lưu với mã DXF 38)

Trở lại bài viết của Tue_NV về Automation Error : Incorrect number of elements in SafeArray
như Tue_NV đã nhận định lỗi này là do : sự không hợp lý về số của phần tử trong mảng.
-> cách giải quyết là chuyển biến Pt1 sang kiểu 2D Variant

Thông thuờng các hàm VLA đều yêu cầu tham số có kiểu Variant .
như vậy khi cung cấp đối số cho hàm VLA, ta phải chuyển qua kiểu Variant tuơng ứng.

để khỏi phải mất công chuyển qua-lại các kiểu, Visua LISP cung cấp hàm vlax-invoke gọi các Method khi đó (trong 1 số t/hợp) chấp nhận kiểu dữ liệu của đối số là List (danh sách)
- (vlax-invoke obj 'AddVertex (1+ (fix ParamPt)) (list (car pt) (cadr pt)))
tuy nhiên tham số Point vẫn phải là kiểu 2D.

Kết luận : tham số Point trong hàm Addvertex chỉ chấp nhận kiểu 2D : list hay Variant
gửi Tue_NV Lisp AddVertex
(defun c:AddVertex1 (/ sel obj pt ParamPt)
(if
(and
(setq sel (entsel "\n Chon Polyline can them Node : "))
(= (cdr (assoc 0 (entget (car sel)))) "LWPOLYLINE")
(setq obj (vlax-ename->vla-object (car sel)))
)
(while (setq pt (getpoint "\n Chon vi tri can them Node : "))
(or
(setq ParamPt (vlax-curve-getParamAtPoint obj pt))
(setq ParamPt (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj pt) ))
)
(if (> (- ParamPt (fix ParamPt)) 0.001); bo qua t/hop diem Pt trung voi dinh cua PLINE
(progn
(setq 2d_array (vlax-make-safearray vlax-vbDouble '(0 . 1));tao safearray 2d co kieu vbDouble
sArray (vlax-safearray-fill 2d_array (list (car pt) (cadr pt))); Nhap data cho safearray
var2d (vlax-make-variant sArray)); tao variant 2d
(vla-AddVertex obj (1+ (fix ParamPt)) var2d)
;(vlax-invoke obj 'AddVertex (1+ (fix ParamPt)) (list (car pt) (cadr pt)))
)
)
)
)
(princ)
)

  • 1

#37 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 16 September 2009 - 11:31 AM

Sorry Tue_NV vì chuyện hỏi một đàng trả lời một nẻo.

Về tham số Point trong hàm Addvertex
- Point : Variant (three-element array of doubles) 3D Variant
mặc dù trong HELP cho là 3D Variant nhưng thực chất là hàm Addvertex chỉ chấp nhận tham số Point với kiểu 2D Variant :s_big:
(Thực tế khi xem các mã DXF của LWPOLYLINE, thông tin các đỉnh cũng đuợc lưu với kiểu 2D, thông tin cao độ Z (Elevation) đuợc lưu với mã DXF 38)

Không phải thế đâu bác ạ. Đường LWPOLYLINE mà bác nói nó là dạng 2Dpolyline. Còn dạng 3Dpolyline (lệnh trong Cad là 3DPOLY) thì nó ra toạ độ mỗi đỉnh là x y z khác nhau chứ không có Elevation như dạng đường 2D.
  • 0

#38 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 16 September 2009 - 12:44 PM

Không phải thế đâu bác ạ. Đường LWPOLYLINE mà bác nói nó là dạng 2Dpolyline. Còn dạng 3Dpolyline (lệnh trong Cad là 3DPOLY) thì nó ra toạ độ mỗi đỉnh là x y z khác nhau chứ không có Elevation như dạng đường 2D.

nataca đọc không kỹ rồi.
Vấn đề đang nói là hàm Addvertex, mà hàm này chỉ dùng đuợc với đối tuợng LWPOLYLINE (Lightweight Polyline) hay 2Dpolyline.
Để thêm đỉnh vào đối tuợng 3Dpolyline phải dùng hàm khác.

(Thực tế khi xem các mã DXF của LWPOLYLINE, thông tin các đỉnh cũng đuợc lưu với kiểu 2D, thông tin cao độ Z (Elevation) đuợc lưu với mã DXF 38)
Tui đang nói về đối tuợng LWPOLYLINE còn bạn nói về đối tuợng 3Dpolyline.
đuơng nhiên DXF hay tọa độ của 2 kiểu đối tuợng này phải khác nhau.
  • 0

#39 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 16 September 2009 - 02:22 PM

nataca đọc không kỹ rồi.
Vấn đề đang nói là hàm Addvertex, mà hàm này chỉ dùng đuợc với đối tuợng LWPOLYLINE (Lightweight Polyline) hay 2Dpolyline.
Để thêm đỉnh vào đối tuợng 3Dpolyline phải dùng hàm khác.

(Thực tế khi xem các mã DXF của LWPOLYLINE, thông tin các đỉnh cũng đuợc lưu với kiểu 2D, thông tin cao độ Z (Elevation) đuợc lưu với mã DXF 38)
Tui đang nói về đối tuợng LWPOLYLINE còn bạn nói về đối tuợng 3Dpolyline.
đuơng nhiên DXF hay tọa độ của 2 kiểu đối tuợng này phải khác nhau.

Ừ nhỉ. Nhưng Method Addvertex vẫn chấp nhận điểm dưới dạng (x y 0) đấy chứ. gia_bach test thử lại xem có đúng không
  • 0

#40 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 30 September 2009 - 09:00 AM

Chào mọi người.
Tue_NV có một điều thắc mắc mà chưa làm được. Xin các bạn chỉ giúp :
Mình đang dùng vla-get-Count để đếm đối tượng nhưng chưa thể đếm được vì chưa thể hiểu được cái Object của nó được định nghĩa như thế nào.
Xin mọi người chỉ giúp

Count Propertiy

Gets the number of items in the collection, dictionary, group, or selection set.

Signature

object.Count

object

All Collections, Block, Dictionary, Group, SelectionSet
The object or objects this property applies to.

Count

Integer; read-only
The number of items in the collection, dictionary, group, or selection set.

Mình không hiểu rõ đối tượng Object của nó là gì mà cụ thể là SelectionSet được định nghĩa như thế nào.
Mong mọi người chỉ giúp. Tue_NV xin chân thành cảm ơn

@ Anh gia_bach : Cảm ơn anh rất nhiều. Nhờ sự hướng dẫn của anh mà Tue_NV đã add (thêm) rất nhiều loại đối tượng.
Cảm ơn anh rất nhiều
  • 0