在 nanoCAD 中将 VBAmacro 转换为 VBscript
Translate VBAmacro to VBscript inside nanoCAD
我正在尝试将在 autoCAD 中工作的 VBAmacro 转换为 VBscript 以与 nanoCAD 一起工作。
我一步一步地将行从 VBAmacro 移动到 VBscript 并查看是否一切正常......
我检查了 ModelSpace
中的每个实体
For c = 0 To ThisDrawing.ModelSpace.Count - 1
如果是 "AcDbBlockReference" 那么我检查它是否有 HasAttributes
If (ent.ObjectName = "AcDbBlockReference") Then
Set ObjRef = ThisDrawing.ModelSpace.Item(c)
If ObjRef.HasAttributes Then
直到这里工作正常但是当我想知道这个 "AcDbBlockReference" 的位置时
ThisDrawing.Utility.Prompt ObjRef.InsertionPoint(0)
我有一个错误......
然后我继续 google 找到这个 page
使用来自 tlbinf32.dll 的 TypeLib 信息对象,可以列出 class.
的所有成员
还有什么???
AcDbBlockReferenceObject IAcadBlockReference
Sub QueryInterface(riid, ppvObj)
Function Unknown Type 19 AddRef()
Function Unknown Type 19 Release()
Sub GetTypeInfoCount(pctinfo)
Sub GetTypeInfo(itinfo, lcid, pptinfo)
Sub GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid)
Sub Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr)
Property (set/get) Handle
Property (set/get) ObjectName
Sub GetXData(AppName, XDataType, XDataValue)
Sub SetXData(XDataType, XDataValue)
Sub Delete()
Property (set/get) ObjectID
Property (set/get) Application
Property (set/get) Database
Property (set/get) HasExtensionDictionary
Function vbEmpty GetExtensionDictionary()
...
...
Property (set/get) color
Property (set ref/get) color
Property (set/get) InsertionPoint <==============
Property (set ref/get) InsertionPoint <==============
Property (set/get) Name
...
其中一个 属性 是 (set/get) InsertionPoint 那么为什么我有错误?
然后我尝试使用此代码:
Set Obj = ThisDrawing.ModelSpace.Item(0)
ThisDrawing.Utility.Prompt Obj.ObjectName
if (IsArray(Obj.InsertionPoint)) then
ThisDrawing.Utility.Prompt "IsArray"
ThisDrawing.Utility.Prompt ubound(Obj.InsertionPoint)
else
ThisDrawing.Utility.Prompt "NOT Array"
end if
响应是:
Obj.ObjectName 是一个 AcDbBlockReference
IsArray 是 true
ubound = 2
那么,如果这会产生错误,我该如何获取 Obj.InsertionPoint(0) 和 Obj.InsertionPoint(1) 的值?
---------------------------------------------- ------------------------
ADD1
如果我使用此代码:
dim Obj
Set Obj = ThisDrawing.ModelSpace.Item(0)
ThisDrawing.Utility.Prompt "Obj.ObjectName: " & Obj.ObjectName
ThisDrawing.Utility.Prompt "isArray() : " & isArray(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt "lbound : " & lbound(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt "ubound : " & ubound(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt Obj.InsertionPoint(0)
结果是
Obj.ObjectName:AcDbBlockReference
isArray() : TRUE
lbound : 0
上下行:2
错误:"Errore di run-time di Microsoft VBScript" 在第 9 行 pos 0 引发异常 "L'oggetto non è un insieme: 'InsertionPoint'"
ThisDrawing.Utility.Prompt Obj.InsertionPoint(0)
如果我尝试通过创建一个新点来移动 blockrference
dim pnt(3)
pnt(0) = 100
pnt(1) = 1000
pnt(2) = 0
Obj.InsertionPoint = pnt
Obj(块引用)从实际位置移动到 pnt
---------------------------------------------- ------------------------
ADD2
我在 javascript
中找到了这个脚本
try {
ThisDrawing.Utility.Prompt(ThisDrawing.ModelSpace(0).EntityName);
ThisDrawing.Utility.Prompt(pt_toString(ThisDrawing.ModelSpace(0).insertionPoint));
}
catch (ex) {
ThisDrawing.Utility.Prompt("oops");
}
function pt_toString(pt)
{
var sp = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(pt))
return sp.toArray().toString();
}
结果是:
AcDbBlockReference
267.9 , 2122.5 , 0
所以实际上我可以在 js 中知道 insertionPoint 但在 vbscript 中不能,为什么???
是否可以将此 js 代码转换为 vbscript?
解决方案
Dim pnt
pnt = ThisDrawing.Utility.CreateSafeArrayFromVector(Obj1.InsertionPoint)
ThisDrawing.Utility.Prompt pnt(0)
ThisDrawing.Utility.Prompt pnt(1)
ThisDrawing.Utility.Prompt pnt(2)
感谢大家
我正在尝试将在 autoCAD 中工作的 VBAmacro 转换为 VBscript 以与 nanoCAD 一起工作。
我一步一步地将行从 VBAmacro 移动到 VBscript 并查看是否一切正常......
我检查了 ModelSpace
For c = 0 To ThisDrawing.ModelSpace.Count - 1
如果是 "AcDbBlockReference" 那么我检查它是否有 HasAttributes
If (ent.ObjectName = "AcDbBlockReference") Then
Set ObjRef = ThisDrawing.ModelSpace.Item(c)
If ObjRef.HasAttributes Then
直到这里工作正常但是当我想知道这个 "AcDbBlockReference" 的位置时
ThisDrawing.Utility.Prompt ObjRef.InsertionPoint(0)
我有一个错误......
然后我继续 google 找到这个 page
使用来自 tlbinf32.dll 的 TypeLib 信息对象,可以列出 class.
的所有成员
还有什么???
AcDbBlockReferenceObject IAcadBlockReference
Sub QueryInterface(riid, ppvObj)
Function Unknown Type 19 AddRef()
Function Unknown Type 19 Release()
Sub GetTypeInfoCount(pctinfo)
Sub GetTypeInfo(itinfo, lcid, pptinfo)
Sub GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid)
Sub Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr)
Property (set/get) Handle
Property (set/get) ObjectName
Sub GetXData(AppName, XDataType, XDataValue)
Sub SetXData(XDataType, XDataValue)
Sub Delete()
Property (set/get) ObjectID
Property (set/get) Application
Property (set/get) Database
Property (set/get) HasExtensionDictionary
Function vbEmpty GetExtensionDictionary()
...
...
Property (set/get) color
Property (set ref/get) color
Property (set/get) InsertionPoint <==============
Property (set ref/get) InsertionPoint <==============
Property (set/get) Name
...
其中一个 属性 是 (set/get) InsertionPoint 那么为什么我有错误?
然后我尝试使用此代码:
Set Obj = ThisDrawing.ModelSpace.Item(0)
ThisDrawing.Utility.Prompt Obj.ObjectName
if (IsArray(Obj.InsertionPoint)) then
ThisDrawing.Utility.Prompt "IsArray"
ThisDrawing.Utility.Prompt ubound(Obj.InsertionPoint)
else
ThisDrawing.Utility.Prompt "NOT Array"
end if
响应是:
Obj.ObjectName 是一个 AcDbBlockReference
IsArray 是 true
ubound = 2
那么,如果这会产生错误,我该如何获取 Obj.InsertionPoint(0) 和 Obj.InsertionPoint(1) 的值?
---------------------------------------------- ------------------------
ADD1
如果我使用此代码:
dim Obj
Set Obj = ThisDrawing.ModelSpace.Item(0)
ThisDrawing.Utility.Prompt "Obj.ObjectName: " & Obj.ObjectName
ThisDrawing.Utility.Prompt "isArray() : " & isArray(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt "lbound : " & lbound(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt "ubound : " & ubound(Obj.InsertionPoint)
ThisDrawing.Utility.Prompt Obj.InsertionPoint(0)
结果是
Obj.ObjectName:AcDbBlockReference
isArray() : TRUE
lbound : 0
上下行:2
错误:"Errore di run-time di Microsoft VBScript" 在第 9 行 pos 0 引发异常 "L'oggetto non è un insieme: 'InsertionPoint'"
ThisDrawing.Utility.Prompt Obj.InsertionPoint(0)
如果我尝试通过创建一个新点来移动 blockrference
dim pnt(3)
pnt(0) = 100
pnt(1) = 1000
pnt(2) = 0
Obj.InsertionPoint = pnt
Obj(块引用)从实际位置移动到 pnt
---------------------------------------------- ------------------------
ADD2
我在 javascript
try {
ThisDrawing.Utility.Prompt(ThisDrawing.ModelSpace(0).EntityName);
ThisDrawing.Utility.Prompt(pt_toString(ThisDrawing.ModelSpace(0).insertionPoint));
}
catch (ex) {
ThisDrawing.Utility.Prompt("oops");
}
function pt_toString(pt)
{
var sp = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(pt))
return sp.toArray().toString();
}
结果是:
AcDbBlockReference
267.9 , 2122.5 , 0
所以实际上我可以在 js 中知道 insertionPoint 但在 vbscript 中不能,为什么???
是否可以将此 js 代码转换为 vbscript?
解决方案
Dim pnt
pnt = ThisDrawing.Utility.CreateSafeArrayFromVector(Obj1.InsertionPoint)
ThisDrawing.Utility.Prompt pnt(0)
ThisDrawing.Utility.Prompt pnt(1)
ThisDrawing.Utility.Prompt pnt(2)
感谢大家