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