Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Code VBA lấy Entity name đối tượng


  • Please log in to reply
13 replies to this topic

#1 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 01:08 PM

Mình có vấn đề như sau:
Thủ tục trong Lisp
(setq ent (car (entsel "\nVao doi tuong: ")))
Kết quả:
<Entity name: 7efa5390>
Nếu dùng VBA để được kết quả như trên dùng cái gì
Mình tìm mãi chưa ra
Cám ơn!
  • 0

#2 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 2012 - 01:20 PM

Mình có vấn đề như sau:
Thủ tục trong Lisp
(setq ent (car (entsel "\nVao doi tuong: ")))
Kết quả:
<Entity name: 7efa5390>
Nếu dùng VBA để được kết quả như trên dùng cái gì
Mình tìm mãi chưa ra
Cám ơn!

Bạn sử dụng method getentity
Bạn đọc thêm Ví dụ trong Help nhé
  • 1

#3 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 01:48 PM

Cám ơn bạn.
Mình đã dùng ThisDrawing.Utility.GetEntity Entry, Point
để Pick chọn đối tượng
Nhưng để kết quả trả về <Entity name: 7efa5390> mình chưa làm được
  • 0

#4 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 2012 - 02:17 PM

Cám ơn bạn.
Mình đã dùng ThisDrawing.Utility.GetEntity Entry, Point
để Pick chọn đối tượng
Nhưng để kết quả trả về <Entity name: 7efa5390> mình chưa làm được

NgocSon có thể nói mục đích của bạn chuyển về Ename để làm gì không?
Theo hiểu biết của mình thì trong sách Activex and VBA reference không có cách nào để chuyển cả
Entity name là đối tượng của Lisp, không phải của VBA
  • 1

#5 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 02:42 PM

Cám ơn bạn quan tâm
Sau khi đọc bài : http://www.cadviet.c...?showtopic=5374
Về trao đổi dữ liệu giữa Autolisp và VBA
Tôi muốn dùng phương thức như sau:
-Chạy thủ tục bằng VBA để chọn 1 đối tượng(LWPL,PL,...)

Sub DT()
Dim Entry As Object
Dim Point As Variant

ThisDrawing.Utility.GetEntity Entry, Point
If Err Then
Err.Clear
ElseIf TypeOf Entry Is AcadLWPolyline Then
Set Tim = Entry
End If
End sub

-Lisp sẽ tự nhận đối tượng này để thao tác.
(setq ent (car (entsel "\nVao doi tuong: ")))
thay bang: (setq ent (car Tim))

  • 0

#6 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 2012 - 02:45 PM

Cám ơn bạn quan tâm
Sau khi đọc bài : http://www.cadviet.c...?showtopic=5374
Về trao đổi dữ liệu giữa Autolisp và VBA
Tôi muốn dùng phương thức như sau:
-Chạy thủ tục bằng VBA để chọn 1 đối tượng(LWPL,PL,...)
ThisDrawing.Utility.GetEntity Entry, Point
-Lisp sẽượng này để thao tác.

Sau khi dùng method getentity bằng VBA
Bạn dùng Lisp để chuyển, dùng hàm này : Vlax-vla-object->ename
  • 1

#7 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 03:03 PM

Mình đã thử:
(setq ent (car (Vlax-vla-object->dsm))
Với dsm là biến được gán trong VBA
; error: no function definition: VLAX-VLA-OBJECT->DSM
Báo lỗi
  • 0

#8 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 2012 - 03:09 PM

Mình đã thử:
(setq ent (car (Vlax-vla-object->dsm))
Với dsm là biến được gán trong VBA
; error: no function definition: VLAX-VLA-OBJECT->DSM
Báo lỗi

Tên hàm nó thế này cơ mà :
Vlax-vla-object->ename

(vlax-vla-object->ename obj)

Vui lòng đọc help :)
  • 0

#9 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 03:15 PM

Cám ơn bạn.Mình đã khai báo như sau:
(setq ent (vlax-vla-object->ename dsm))
hàm báo lỗi
; error: bad argument type: VLA-OBJECT nil
Thân!
  • 0

#10 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 2012 - 03:17 PM

Cám ơn bạn.Mình đã khai báo như sau:
(setq ent (vlax-vla-object->ename dsm))
hàm báo lỗi
; error: bad argument type: VLA-OBJECT nil
Thân!

Dòng đó lỗi đối số, biến dsm không phải là 1 VLA-OBJECT
Bạn sử dụng hàm Type để thấy kiểu biến
(Type dsm)
  • 1

#11 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 03:27 PM

Mình chưa rõ ý lắm. Đã thử nhưng vẫn lỗi trên.Toàn bộ Code như sau

Public VL As Object
Public Tim as AcadLWPolyline
'-------------------------------------------------------------
Sub VBA2Lisp_example()
Set VL = CreateObject("VL.Application.16")
PutLispSym "dsm", Tim
End Sub
'-------------------------------------------------------------
Function GetLispSym(symbolName As String) As Variant
Dim sym As Object
GetLispSym = vbEmpty
If VL Is Nothing Then Exit Function
Set sym = VL.ActiveDocument.Functions.item("read").funcall(symbolName)
GetLispSym = VL.ActiveDocument.Functions.item("eval").funcall(sym)
End Function
'-------------------------------------------------------------
Sub PutLispSym(symbolName As String, value As AcadLWPolyline) 'value As Variant
If VL Is Nothing Then Exit Sub
Dim sym As Object
Set sym = VL.ActiveDocument.Functions.item("read").funcall(symbolName)
VL.ActiveDocument.Functions.item("set").funcall sym, value
End Sub
'-------------------------------------------------------------
Sub DT()
Dim Entry As Object
Dim Point As Variant
ThisDrawing.Utility.GetEntity Entry, Poin
If Err Then
Err.Clear
ElseIf TypeOf Entry Is AcadLWPolyline
Then
Set Tim = Entry
End If
End Sub
'----------Code lisp
(defun c:PST()
(vl-load-com)
(setq ent (vlax-vla-object->ename (Type dsm)))
)
Trước khi chạy PST gọi Macro: DT và VBA2Lisp_example
  • 0

#12 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 16 November 2012 - 08:59 AM

Một Entity có các đặc điểm nhận dạng:
- ObjectName: ứng với từng kiểu đối tượng,cho dù ở bất kỳ bản vẽ nào.
- ObjectID: duy nhất tại thời điểm mở, thay đổi mỗi khi bản vẽ được mở lên.
- Handle: duy nhất trong 1 bản vẽ, không thay đổi trong suốt thời gian sống của nó.

Entity Name ở câu hỏi trên trong VBA chính là Handle của nó.

Từ Handle, ta có thể lấy dữ liệu từ nó: ThisDrawing.HandleToObject(Handle)
  • 1
Clear sky!

MF Rock collection.

#13 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 16 November 2012 - 10:10 AM

Một Entity có các đặc điểm nhận dạng:
- ObjectName: ứng với từng kiểu đối tượng,cho dù ở bất kỳ bản vẽ nào.
- ObjectID: duy nhất tại thời điểm mở, thay đổi mỗi khi bản vẽ được mở lên.
- Handle: duy nhất trong 1 bản vẽ, không thay đổi trong suốt thời gian sống của nó.

Entity Name ở câu hỏi trên trong VBA chính là Handle của nó.

Từ Handle, ta có thể lấy dữ liệu từ nó: ThisDrawing.HandleToObject(Handle)

Bác có thể cụ thể hơn cho Object là LWPL. Vì em lấy Handle của nó thì nó báo không có?
Em đang rất cần !
  • 0

#14 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 16 November 2012 - 12:46 PM

Handle là thuộc tính bắt buộc phải có.

dim hwnd as string
hwnd = object.Handle

object là đối tượngsau:
All Drawing objects, Block, Blocks, Dictionary, Dictionaries, DimStyle, DimStyles, Group, Groups, Layer, Layers, Layout, Layouts, Linetype, Linetypes, ModelSpace Collection, PaperSpace Collection, PlotConfiguration, PlotConfigurations, RegisteredApplication, RegisteredApplications, TextStyle, TextStyles, UCS, UCSs, View, Views, Viewport, Viewports, XRecord
  • 0
Clear sky!

MF Rock collection.