Chuyển đến nội dung
Diễn đàn CADViet
Tue_NV

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

Các bài được khuyến nghị

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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ồ.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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ụ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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)
)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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)
)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
........

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)
 )

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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)

)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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)
 )

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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

..............

Chào Tue_NV

Vla-get-Count : trả về số luợng đối tuợng trong 1 tập chọn, tương tự sslength trong Lisp.

 

Tham số SelectionSet là 1 tập chọn các đối tuợng, kiểu VLA-OBJECT

1. Khi chọn đối tuợng với lệnh ssget hay entsel, dùng hàm vla-get-activeselectionset để Set Active cho tập đối tuợng vừa chọn, đồng thời hoán đổi tập đối tuợng này thành kiểu VLA-OBJECT . ( tương tự lệnh vlax-ename->vla-object )

(defun c:sel(/ di ent n sel)
 (vl-load-com)
 (if (ssget '((0 . "LINE")))
   (progn
     (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
     (alert (strcat "Ban da chon " (itoa (vla-get-count sel)) " duong thang." ))
     (vla-delete sel)
     )
   )
 (princ)
 )

2. Truờng hợp chọn đối tuợng bằng lệnh của VBA (Select, SelectAtPoint, SelectByPolygon, SelectOnScreen) , tập chọn các đối tuợng trả về là kiểu VLA-OBJECT. Tham khảo chọn đối tuợng bằng lệnh của VBA tại http://www.afralisp.net

(defun c:sel1();/ ssets ssobj)
 (setq	ssets (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object)))) 
 (setq ssobj (vla-add ssets "selection1"))
 (vla-SelectOnScreen ssobj)
 (if (> (vla-get-count ssobj) 0)
   (alert (strcat "Ban da chon " (itoa (vla-get-count ssobj)) " doi tuong." ))
   (alert "\nKhong chon duoc doi tuong nao.")
   )
 (vla-delete ssobj)
 (princ)
 )

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào các anh , các chị, các bác.....: Thông cảm cho em vì phải dựng các bác từ năm 2009 dậy < hồi 2009 thì em vẫn còn cắp sách đạp xe đạp tới trường, còn các bác thì trình độ cao lắm rồi > .... Thôi thì cái gì cũng phải dần dần: ^^

 

Em muốn hỏi 1 câu như ý của bác #PhamThanhBinh từng hỏi mà chưa tìm thấy câu trả lời phù hợp:

Trong dòng Code : (setq g (vlax-variant-value (vla-IntersectWith ob1 ob2 acExtendNone)))

(if (/= (vlax-safearray-get-u-bound g 1) -1) (setq L (vlax-safearray->list g)))      thì việc so sánh giá trị "-1"  ở đây có ý nghĩa như thế nào ạ. Mong mọi người giải thích cho sự tò mò của em. :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Quick reply là k giao thì trả về u-bound của phần tử đầu là -1 ^^

Cám ơn anh  Kẹt Xu " ^^.

Nhưng em vẫn chưa hiểu bản chất số "-1" nó được tạo ra lúc nào.

Em hiểu như sau < Em đang học tập viết lisp, nên ngu ngơ thì anh cũng đừng giận : )) >

 

+ Giả sử 2 đường Ob1 và Ob2 không giao nhau, lúc đó thì

1) Intersecwith : Trả về tọa độ điểm ----> Do không có giao điểm thì trả về nil.

2) Vlax-Variant-value - Trả về giá trị Variant: Do không có, nên kết quả trả về nil.  Không có biến mảng nào cả. Vậy G=Nil.

3) Safearray-get-u-bound: Với G=Nil ---> thì kết quả mặc định là trả về "-1" ạ.. ( Cái này em đọc trong Help thì hiểu là kết quả trả về là "Error")

 

Mong anh giúp em hiểu rõ.   :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 16/9/2009 tại 12:44, gia_bach đã nói:

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.

Bác ơi cái hàm vlax-invoke 'addvertex thì em hiểu rõ rồi. Nhưng em đang tìm hàm nào thêm đỉnh cho đường 3dpoly. Theo tìm hiểu thì nó k phải là addvertex mà là appendvertex thì phải. Nhưng k biết cấu trúc của nó ntn. Em thử (vlax-invoke-method obj 'appendvertex (vlax-3d-point pt)) rồi mà nó chỉ thêm đỉnh vào cuối đường 3p thôi

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
11 giờ trước, Phamdung01 đã nói:

Bác ơi cái hàm vlax-invoke 'addvertex thì em hiểu rõ rồi. Nhưng em đang tìm hàm nào thêm đỉnh cho đường 3dpoly. Theo tìm hiểu thì nó k phải là addvertex mà là appendvertex thì phải. Nhưng k biết cấu trúc của nó ntn. Em thử (vlax-invoke-method obj 'appendvertex (vlax-3d-point pt)) rồi mà nó chỉ thêm đỉnh vào cuối đường 3p thôi

Tham khảo lisp add vertex tại trung điểm của các segments :

(defun c:3dpseg-midvtx ( / ss i e l p pl mpl pln )
  (if (setq ss (ssget "_:L" '((0 . "POLYLINE") ))))
    (repeat (setq i (sslength ss))
      (setq e (ssname ss (setq i (1- i))))
      (setq l (safearray-value (variant-value (vla-get-coordinates (vlax-ename->vla-object e)))))
      (repeat (/ (length l) 3)
        (setq p (list (car l) (cadr l) (caddr l)))
        (setq pl (cons p pl))
        (setq l (cdddr l))      )
      
      (setq pl (reverse pl))
      (if (vlax-curve-isclosed e)
        (setq pl (reverse (cons (car pl) (reverse pl))))      )
      
      (setq mpl (mapcar '(lambda ( a b ) (mapcar '(lambda ( c d ) (/ (+ c d) 2.0)) a b)) pl (cdr pl)))
      (setq pln (apply 'append (mapcar '(lambda ( a b ) (list a b)) pl mpl)))
      (if (not (vlax-curve-isclosed e))
        (setq pln (reverse (cons (last pl) (reverse pln))))      )
      
      (repeat (length mpl)
        (vla-appendvertex (vlax-ename->vla-object e) (vlax-3d-point (last pl)))      )
      
      (vlax-put (vlax-ename->vla-object e) 'coordinates (apply 'append pln))
      (setq pl nil pln nil)    )  )
  (princ))

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 21/10/2018 tại 10:04, gia_bach đã nói:

Tham khảo lisp add vertex tại trung điểm của các segments :

  • 3dpseg-midvtx.lsp
    lisp help
  •  

(defun c:3dpseg-midvtx ( / ss i e l p pl mpl pln )
  (if (setq ss (ssget "_:L" '((0 . "POLYLINE") ))))
    (repeat (setq i (sslength ss))
      (setq e (ssname ss (setq i (1- i))))
      (setq l (safearray-value (variant-value (vla-get-coordinates (vlax-ename->vla-object e)))))
      (repeat (/ (length l) 3)
        (setq p (list (car l) (cadr l) (caddr l)))
        (setq pl (cons p pl))
        (setq l (cdddr l))      )
      
      (setq pl (reverse pl))
      (if (vlax-curve-isclosed e)
        (setq pl (reverse (cons (car pl) (reverse pl))))      )
      
      (setq mpl (mapcar '(lambda ( a b ) (mapcar '(lambda ( c d ) (/ (+ c d) 2.0)) a b)) pl (cdr pl)))
      (setq pln (apply 'append (mapcar '(lambda ( a b ) (list a b)) pl mpl)))
      (if (not (vlax-curve-isclosed e))
        (setq pln (reverse (cons (last pl) (reverse pln))))      )
      
      (repeat (length mpl)
        (vla-appendvertex (vlax-ename->vla-object e) (vlax-3d-point (last pl)))      )
      
      (vlax-put (vlax-ename->vla-object e) 'coordinates (apply 'append pln))
      (setq pl nil pln nil)    )  )
  (princ))

 

em đã hiểu. cảm ơn nhiều ạ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×