mitja Posted January 11, 2011 Report Share Posted January 11, 2011 задам совсем детский вопрос, как нарисовать линию на JS ? 1 Quote Link to comment Share on other sites More sharing options...
dows Posted January 12, 2011 Report Share Posted January 12, 2011 задам совсем детский вопрос, как нарисовать линию на JS ? mitja, все очень подробно описано тут: http://habrahabr.ru/company/nanosoft/blog/86970/ А в папке C:\Program Files\Nanosoft\nanoCAD 2.5\help\api есть документация с примерами. Но если говорить о линии на JS, то так: var ms = ThisDrawing.ModelSpace;var x = 0; var y = 0; var z = 0; ms.AddLine(x + "," + y + "," + z, (x + 2000) + "," + (y + 4000) +"," + z); Quote Link to comment Share on other sites More sharing options...
mitja Posted January 13, 2011 Report Share Posted January 13, 2011 спасибо,почитаю. Quote Link to comment Share on other sites More sharing options...
Archr Posted February 27, 2011 Report Share Posted February 27, 2011 А можно привести какой-нибудь пример по использованию селекции объектов или ссылку в help, где есть пример. Использую vbs. Quote Link to comment Share on other sites More sharing options...
ISL Posted March 5, 2011 Report Share Posted March 5, 2011 Для начала нужно обновить OdaX_csd.dll ftp://ftp.nanocad.ru/nc20/NC25(1114)_OdaX_fix.zip appName = "nanoCAD.Application" On Error Resume Next Set app = GetObject("", appName) If Err <> 0 Then Set app = CreateObject(appName) app.Visible = True End If Set ThisDrawing = app.ActiveDocument set lines = ThisDrawing.SelectionSets.Add("Lines") set lines = ThisDrawing.SelectionSets("Lines") lines.Select 5, Nothing, Nothing, 0, "LINE" echo lines.Count & " lines out of " & ThisDrawing.ModelSpace.Count & " objects" i=1 For Each e in lines echo "processing line " & i & "..." echo "" & e.Handle & " from " & pt_toString(e.StartPoint) & " to " & pt_toString(e.EndPoint) i=i+1 Next Function pt_toString(pt) p = ThisDrawing.Utility.CreateSafeArrayFromVector(pt) pt_toString = "<" & p(0) & "," & p(1) & ">" End Function Sub echo(msg) ThisDrawing.Utility.Prompt msg WScript.StdOut.WriteLine msg End Sub Quote Link to comment Share on other sites More sharing options...
Archr Posted March 6, 2011 Report Share Posted March 6, 2011 Спасибо. То что нужно. При запуске примера заметил, что функция pt_toString не работает. Quote Link to comment Share on other sites More sharing options...
ISL Posted March 9, 2011 Report Share Posted March 9, 2011 Странно. При наличии чертежа, в котором есть линии, получается так: 4 lines out of 4 objects processing line 1... 353 from <25359.1087639363,36653.7614767467> to <45911.5935698963,36653.7614767467> processing line 2... 354 from <45911.5935698963,36653.7614767467> to <15735.3261960661,12675.86253646> processing line 3... 355 from <15735.3261960661,12675.86253646> to <43301.7542294569,7293.06889680383> processing line 4... 356 from <43301.7542294569,7293.06889680383> to <23727.9591761617,15122.5869181219> Quote Link to comment Share on other sites More sharing options...
Archr Posted March 10, 2011 Report Share Posted March 10, 2011 Я тоже ждал такого вывода, но у меня только так: Script file path или [./]: C:\test\test.vbs 3 lines out of 3 objects processing line 1... processing line 2... processing line 3... обработчик ошибок: processing line 1...err: "Ошибка выполнения Microsoft VBScript" raised an exception "Недопустимый вызов или аргумент процедуры" at line 26 pos 4 p = ThisDrawing.Utility.CreateSafeArrayFromVector(pt) Quote Link to comment Share on other sites More sharing options...
nicolas Posted June 16, 2011 Report Share Posted June 16, 2011 Здравствуйте. После переустановки нанокада на версию 3.0 возникли проблемы следующего характера. Ранее под версию 2.5 написал на vb в среде visual studio 2008 программу, которая через COM-объекты нанокада рисовала в нем некую графику. При этом использовал СОМ-объекты nanoCAD Type Library и OdaX 3.03 Type library, которые были расположены в файлах NCAuto.dll и OdaX_csd.dll соответственно. При установке нанокада 2.5 эти объекты автоматически зарегистрировались в системе и все было здорово. Теперь после установки версии 3.0 автоматически зарегистрировался в системе только nanoCAD Type Library, OdaX нет (причем соответствующие файлы в сборке присутствуют). Ручная регистрация в visual studio и подключение этих файлов к проекту VB успехов не имели - visual studio пишет, что в данном файле нет СОМ-объекта. В результате программа, написанная под 2.5 не работает под 3.0. Прошу помочь. Еще один небольшой ньанс (это вдогонку). СОМ-объект в файле OdaX_csd.dll в сборке версии 2.5 тоже работал нестабильно: на домашнем компе он регистрировался в системе при установке нанокада, на рабочем нет. Эту проблему я так и не победил - программировал под нанокад на домашнем компе. теперь же в версии 3.0 СОМ-объект OdaX_csd.dll и на домашнем компе перестал регистрироваться. Прокоментируйте пожалуйста эту ситуацию. P.S. Дома система нелицензионная версия WinXP Professional версия 2002 SP3(была установлена со ZverDVD) На работе все тоже самое, только лицензионное (установлена с лицензионного диска). Quote Link to comment Share on other sites More sharing options...
nicolas Posted June 16, 2011 Report Share Posted June 16, 2011 После долгих попыток мне удалось зарегистрировать оба компонента на домашнем компе (регистрировал СОМ-объекты вручную с помощью команды regsvr32 *.dll, а потом добавлял компонент в vb проект). В результате это сработало, правда не с первого раза. Эту же процедуру проверил в Win7 - работает. А вот рабочий комп так и не поддается. ручная регистрация терпит неудачу. могу предположить что СОМ-объекты имеют какие-то зависимости от других библиотек, которых у меня на рабочем компе нет и из-за этогоь не проходит регистрация СОМ-объектов. Прошу сообщить минимальный набор библиотек необходимый для регистрации nanoCAD Type Library и OdaX 3.04 Type library или предложить какой-то альтернативный путь решения проблемы. Quote Link to comment Share on other sites More sharing options...
nicolas Posted July 12, 2011 Report Share Posted July 12, 2011 Указанная мной проблема решилась в сборке 1194 файлы NCAuto.dll и OdaX_csd.dll успешно зарегистрировались. Но тут возникла еще одна непонятная ситуация следующий код Public objNanoCADApp As nanoCAD.Application Public doc As nanoCAD.Document Public ms As OdaX.AcadModelSpace objNanoCADApp = CreateObject("NanoCAD.Application") doc = objNanoCADApp.Documents.Open("test.dwg") ms = doc.ModelSpace не работает visual studio пишет, что интерфейс ModelSpace не зарегистрирован {Exception from HRESULT 0x80040155} (ранее в версии 2.5 этот код работал) Quote Link to comment Share on other sites More sharing options...
nicolas Posted July 12, 2011 Report Share Posted July 12, 2011 Есть предположение что OdaX 3.04 все же как-то неправильно зарегистрировался, потому как в интерфейсе nanoCAD.Document много интерфейсов из OdaX (в том числе и ModelSpace ) и все они помечены в visual studio как "интерфейс не зарегистрирован {Exception from HRESULT 0x80040155} Заранее благодарен Quote Link to comment Share on other sites More sharing options...
ISL Posted July 12, 2011 Report Share Posted July 12, 2011 Сборка 1194 не отличается от сборки 1193 в части COM интерфейса. Видимо, дело в том, что Вы переустановили продукт. Quote Link to comment Share on other sites More sharing options...
ISL Posted July 12, 2011 Report Share Posted July 12, 2011 Попробуйте NCad.exe /register Создал тестовый проект, работает. AddReference->COM->nanoCAD Type Library 2.0. OdaX подключился сам. Module Module1 Public objNanoCADApp As nanoCAD.Application Public doc As nanoCAD.Document Public ms As OdaX.AcadModelSpace Sub Main() objNanoCADApp = CreateObject("NanoCAD.Application") doc = objNanoCADApp.Documents.Open("c:\\TEMP\\test.dwg") ms = doc.ModelSpace End Sub End Module То же для C# namespace TestNCadCom { class Program { static void Main(string[] args) { var objNanoCADApp = new nanoCAD.Application(); var doc = objNanoCADApp.Documents.Open("c:\\TEMP\\test.dwg", false, ""); var ms = doc.ModelSpace; } } } Quote Link to comment Share on other sites More sharing options...
nicolas Posted July 13, 2011 Report Share Posted July 13, 2011 спасибо, за быстрый ответ. помогло частично, есть один нюанс. изначально пробовал ncad.exe/register под учетной записью не имеющей админских прав - проблемма осталась. попробовал все тоже самое под учетной записью с правами администратора - все заработало. причем и в 1 и во 2 случае nanoCAD Type Library 2.0 и OdaX в системе зарегистрировались (по крайней мере они доступны в visual studio по ссылке AddReference->COM), но не под админом интерфейсы OdaX работать не хотят - возникает ошибка выполнения при обращении к ним (компилируется код без проблем) Это для меня критично, поскольку exe-шник откомпилированный и работающий под админской учетной записью не работает под учетными записями пользователей, а это важно (нельзя всем пользователям раздать админские права). Я попробовал расшарить папку где установлен нанокад для всех пользователей - не помогло. может тут что-то посоветуете? Quote Link to comment Share on other sites More sharing options...
nicolas Posted August 5, 2011 Report Share Posted August 5, 2011 неужели никаких предложений нету? 3 Quote Link to comment Share on other sites More sharing options...
amk Posted August 5, 2011 Report Share Posted August 5, 2011 Дурацкий тут редактор. Зачем он окно очищает, спрашивается, когда в нем текст написан? Думаю особо много предложений и не будет. Да и те будут почти сплошь тривиальными. Если что, пользуются этой программой не программисты, малая часть из которых знают Visual Basic (остальные даже не считают его языком программирования). И не Web-дизайнеры, из которых большинство знакомы с java script или visual basic script. Те же из программистов, которые ей пользуются, в большинстве используют ее для простого черчения (возможно в 3D), для чего имеющегося функционала и так более чем достаточно. Если же придется реализовывать на базе nanoCAD какой-то крупный проект, то писаться модули будут скорее с использованием C/C++. И просто так их уже никто не выложит. Quote Link to comment Share on other sites More sharing options...
nicolas Posted August 9, 2011 Report Share Posted August 9, 2011 да я и не прочь на С++ написать - это мой родной язык программирования. VB использую потому что изначально проект был на нем написан - не хочется переделывать. Пробовал цеплять библиотеки нанокада под С++, но там вываливается куча ошибок в h-файлах, не стал разбираться... Кстати в версии 2.5 нанокада проблем с регистрацией компонентов под администартором/не администратором не было, так что я думаю не такая уж она и сложная (проблемма). Quote Link to comment Share on other sites More sharing options...
dimamix Posted August 10, 2011 Report Share Posted August 10, 2011 Добрый день. Перетаскиваю VBA с автокада на нанокад 3.0 и уперся в TransformBy под автокадом с такими параметрами матрицы - работает Dim transMat(3, 3) a0 = 2282497.1153 a1 = 0.999972153890533 a2 = -0.00746267 b0 = 458817.415 b1 = 0.00746267 b2 = 0.999972153890533 transMat(0, 0) = a1 : transMat(0, 1) = a2 : transMat(0, 2) = 0. : transMat(0, 3) = a0 transMat(1, 0) = b1 : transMat(1, 1) = b2 : transMat(1, 2) = 0. : transMat(1, 3) = b0 transMat(2, 0) = 0. : transMat(2, 1) = 0. : transMat(2, 2) = 1. : transMat(2, 3) = 0. transMat(3, 0) = 0. : transMat(3, 1) = 0. : transMat(3, 2) = 0. : transMat(3, 3) = 1. Set sset = ThisDrawing.SelectionSets.Add("MIX") sset.SelectOnScreen For i = 0 To sset.Count - 1 sset.Item(i).TransformBy transMat Next после указания элемента возникает ошибка Выбор объектов: err: "TeighaX" raised an exception "Параметр задан неверно." at line XX pos 8 sset.Item(i).TransformBy transMat ^ Не понятно в чем дело ((( Quote Link to comment Share on other sites More sharing options...
nicolas Posted August 11, 2011 Report Share Posted August 11, 2011 проблему решил следующим образом: даешь пользователю админские права, регистирируешь библиотеки нанокад ncad.exe /register, отбираешь адмнские права у пользователя - так все работает. Quote Link to comment Share on other sites More sharing options...
ISL Posted August 25, 2011 Report Share Posted August 25, 2011 To dimamix: Dim transMat(3, 3) создаёт массив VT_ARRAY|VT_VARIANT В OdaX ожидается массив VT_ARRAY|VT_R8, в текущей версии OdaX конвертера из VT_ARRAY|VT_VARIANT нет. В Utility есть «нестандартный» метод Matrix4x4, котрый на входе принимает строку, содержащую элементы матрицы разделенные запятыми, а на выходе возвращает правильную матрицу: Set transMat = ThisDrawing.Utility.Matrix4x4 “0.999972153890533, -0.00746267,0, 2282497.1153,” & _ “0.00746267, 0.999972153890533,0, 458817.415,” & _ “0,0,1,0,” & “0,0,0,1” <…> ent.TransformBy transMat Quote Link to comment Share on other sites More sharing options...
mam9 Posted October 26, 2011 Report Share Posted October 26, 2011 вопрос по созданию Polyline был код на Delphi в AutoCAD работает без проблем ///////////////////////////// var p : olevariant; i : integer; pline : variant; begin p:= VarArrayCreate([0,4*3-1], varDouble); for i := 0 to 3 do begin p[i*3]:=i*20; p[i*3+1]:=i*20; p[i*3+2]:=0; end; pline := nanocad.ActiveDocument.ModelSpace.AddPolyline(p); pline.Closed := True; pline.Update; ////////////////////////////// TeighaX" raised an exception "Параметр задан неверно." вылетает ошибка я так понимаю связанная с типом или форматом массива, какой тип правильно использовать? AddLine рисуется нормально. Quote Link to comment Share on other sites More sharing options...
ADAN Posted November 14, 2011 Report Share Posted November 14, 2011 Вот пример работающего скрипта по созданию полилиний var ms = ThisDrawing.ModelSpace; var ut = ThisDrawing.Utility; var ptCenter = ut.GetPoint(null, "give me a star center"); var n; while ((n = ut.GetInteger("give me a number of star rays (greater than 2)")) < 3) ; var d = ut.GetDistance(ptCenter, "give me inner radius") var D = ut.GetDistance(ptCenter, "give me outer radius") var da = Math.PI * 2 / n; var hd = da / 2; var coords = new Array(); for (i = 0; i < n; ++i) { var a = da * i; var p1 = ut.PolarPoint(ptCenter, a - hd, d); var pt1 = new VBArray(ut.CreateSafeArrayFromVector(p1)); var p2 = ut.PolarPoint(ptCenter, a, D); var pt2 = new VBArray(ut.CreateSafeArrayFromVector(p2)); var p3 = ut.PolarPoint(ptCenter, a + hd, d) var pt3 = new VBArray(ut.CreateSafeArrayFromVector(p3)); coords.push(pt1.getItem(0)); coords.push(pt1.getItem(1)); coords.push(pt2.getItem(0)); coords.push(pt2.getItem(1)); coords.push(pt3.getItem(0)); coords.push(pt3.getItem(1)); } var ccv = ut.CreateTypedArrayFromJSArray(5, "1"); var cv = ut.CreateTypedArrayFromJSArray(5, coords); ms.AddLightWeightPolyline(cv); Quote Link to comment Share on other sites More sharing options...
sTolyaR Posted November 21, 2011 Report Share Posted November 21, 2011 вопрос по созданию Polyline был код на Delphi в AutoCAD работает без проблем ///////////////////////////// var p : olevariant; i : integer; pline : variant; begin p:= VarArrayCreate([0,4*3-1], varDouble); for i := 0 to 3 do begin p[i*3]:=i*20; p[i*3+1]:=i*20; p[i*3+2]:=0; end; pline := nanocad.ActiveDocument.ModelSpace.AddPolyline(p); pline.Closed := True; pline.Update; ////////////////////////////// TeighaX" raised an exception "Параметр задан неверно." вылетает ошибка я так понимаю связанная с типом или форматом массива, какой тип правильно использовать? AddLine рисуется нормально. Та же проблема присутствует. И с Add3Dpoly тоже. При использовании раннего связывания работает, а так нет. В чем может быть дело? Quote Link to comment Share on other sites More sharing options...
ADAN Posted November 25, 2011 Report Share Posted November 25, 2011 Вот пример работающего кода: 1) внешний JScript var VT_R8 = 5; var ncApp = getNCApp(); ncApp.Visible=true; var doc = ncApp.ActiveDocument; var ms = doc.ModelSpace; var ut = doc.Utility; var ptCenter = ut.GetPoint(null, "give me a star center"); var n = ut.GetInteger("give me a number of star rays") var d = ut.GetDistance(ptCenter, "give me inner diameter") var D = ut.GetDistance(ptCenter, "give me outer diameter") var da = Math.PI * 2 / n; var hd = da / 2; var coords = new Array(); for (i = 0; i < n; ++i) { var a = da * i; var p1 = ut.PolarPoint(ptCenter, a - hd, d); var pt1 = new VBArray(ut.CreateSafeArrayFromVector(p1)); var p2 = ut.PolarPoint(ptCenter, a, D); var pt2 = new VBArray(ut.CreateSafeArrayFromVector(p2)); var p3 = ut.PolarPoint(ptCenter, a + hd, d) var pt3 = new VBArray(ut.CreateSafeArrayFromVector(p3)); coords.push(pt1.getItem(0)); coords.push(pt1.getItem(1)); coords.push(pt1.getItem(2)); coords.push(pt2.getItem(0)); coords.push(pt2.getItem(1)); coords.push(pt2.getItem(2)); coords.push(pt3.getItem(0)); coords.push(pt3.getItem(1)); coords.push(pt3.getItem(2)); } var cv = ut.CreateTypedArrayFromJSArray(VT_R8, coords); ms.AddPolyline(cv); function ptdump(ut, pt) { var sp = new VBArray(ut.CreateSafeArrayFromVector(pt)) return "(" + sp.toArray() + ")"; } function getNCApp() { var ncApp; var appCLS = "NCad.Application"; try { ncApp = GetObject(appCLS) } catch (ex) { try { ncApp = new ActiveXObject(appCLS); } catch (ex) { WScript.StdErr.WriteLine("There is no ncApp") WScript.Quit(); } } return ncApp; } 2) "нативная" аппликация int _tmain(int argc, _TCHAR* argv[]) { CoInitializer _coInit; //LPCWSTR progId = L"AutoCad.Application"; LPCWSTR progId = L"NCad.Application"; CLSID clsId; if (FAILED(::CLSIDFromProgID(progId, &clsId))) { cerr << "Unable to get clsid of " << progId << "\r\n"; return 0; } CComPtr<IUnknown> unkApp; if (FAILED(::GetActiveObject(clsId, 0, &unkApp))) { cerr << "create the " << progId << "\r\n"; if (FAILED(unkApp.CoCreateInstance(clsId))) { cerr << "Unable create " << progId << "\r\n"; return 0; } } CComDispatchDriver app; unkApp.QueryInterface(&app); CComVariant varActiveDoc; if (FAILED(app.GetPropertyByName(L"ActiveDocument", &varActiveDoc))) { cerr << "property get(ActiveDocument) failed" << "\r\n"; return 0; } CComDispatchDriver activeDoc(V_DISPATCH(&varActiveDoc)); CComVariant vPoints; vPoints.parray = ::SafeArrayCreateVectorEx(VT_R8, 0, 12, 0); if (!vPoints.parray) { cerr << "out of mem" << "\r\n"; return 0; } vPoints.vt = VT_R8 | VT_ARRAY; double* p; if (FAILED(::SafeArrayAccessData(vPoints.parray, reinterpret_cast<void**>(&p)))) { cerr << "unable to access data" << "\r\n"; return 0; } for (size_t idx = 0; idx < 4; ++idx, p += 3) { p[0] = 20.0 * idx; p[1] = 20.0 * idx; p[2] = 0; } ::SafeArrayUnaccessData(vPoints.parray); CComVariant varMSpace; if (FAILED(activeDoc.GetPropertyByName(L"ModelSpace", &varMSpace))) { cerr << "property get(ModelSpace) failed" << "\r\n"; return 0; } CComDispatchDriver dispMSpace(V_DISPATCH(&varMSpace)); CComVariant vRes; if (FAILED(dispMSpace.Invoke1(L"AddPolyline", &vPoints, &vRes))) { cerr << "property AddPolyline failed" << "\r\n"; return 0; } return 0; } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.