Перевести VBAmacro на VBscript внутри nanoCAD - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь перевести VBAmacro, работающий в autoCAD, на 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 "by

ThisDrawing.Utility.Prompt ObjRef.InsertionPoint(0)

У меня ошибка .....
Затем я захожу на Google и нашел эту страницу
Использование информационных объектов TypeLib изtlbinf32.dll можно перечислить всех членов класса.
и что ???

  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 является 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
ubound: 2
err: «Ошибка времени выполнения Microsoft VBScript» вызвала исключение «L'oggetto non è un insieme:« InsertionPoint »» в строке 9 поз 0 ThisDrawing.Utility.Prompt Obj.InsertionPoint (0)

и если я попытаюсь переместить блок-ссылку, создав новую точку

dim pnt(3)
pnt(0) = 100
pnt(1) = 1000
pnt(2) = 0
Obj.InsertionPoint = pnt

, то объект (блок-ссылка) переместится из фактической позиции в 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
Так что на самом деле я могу знать inserttionPoint в js, но не в vbscriptпочему ???
Можно ли перевести этот js-код в vbscript?

1 Ответ

0 голосов
/ 24 марта 2019

РЕШЕНИЕ

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

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

спасибо за все

...