Я пытаюсь перевести 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?
РЕШЕНИЕ
Dim pnt
pnt = ThisDrawing.Utility.CreateSafeArrayFromVector(Obj1.InsertionPoint)
ThisDrawing.Utility.Prompt pnt(0)
ThisDrawing.Utility.Prompt pnt(1)
ThisDrawing.Utility.Prompt pnt(2)
Спасибо за все