Перевести VBAmacro на VBscript внутри nanoCAD

1

Я пытаюсь перевести 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" по

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 это правда
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
ошибка: "Ошибка выполнения во время выполнения 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

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
Так что на самом деле я могу знать, вставка Point в JS, но не в VBScript, почему???
Можно ли перевести этот код JS в VBScript?

  • 1
    «У меня ошибка .....» В чем ошибка?
  • 0
    VBScript не использует библиотеки типов.
Показать ещё 3 комментария
Теги:
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)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню