我正在尝试将使用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)
我有一个错误..... 然后我继续谷歌,发现这个page 使用来自tlbinf32.dll的TypeLib信息对象,可以列出类的所有成员。 什么???
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
...
其中一个属性是(设置/获取)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是真的 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 ubound:2 错误:“Errore di run-time di Microsoft VBScript”引发了一个异常“L'oggettononèuninsieme:'InsertionPoint'”在第9行pos 0 ThisDrawing.Utility.Prompt Obj.InsertionPoint(0)
如果我尝试通过创建一个新点来移动阻止参数
dim pnt(3)
pnt(0) = 100
pnt(1) = 1000
pnt(2) = 0
Obj.InsertionPoint = pnt
Obj(blockreference)从实际位置移动到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中知道插入点而不是在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)
谢谢大家