将nano中的VBAmacro转换为VBscript

问题描述 投票:1回答:1

我正在尝试将使用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?

javascript vba vbscript autocad cad
1个回答
0
投票

解决方案

Dim pnt
pnt = ThisDrawing.Utility.CreateSafeArrayFromVector(Obj1.InsertionPoint)

ThisDrawing.Utility.Prompt pnt(0) 
ThisDrawing.Utility.Prompt pnt(1) 
ThisDrawing.Utility.Prompt pnt(2)

谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.