Jump to content

Первые шаги в мир программирования под nanoCAD


Recommended Posts

задам совсем детский вопрос, как нарисовать линию на JS ? :huh:

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);

Link to comment
Share on other sites

  • 1 month later...

А можно привести какой-нибудь пример по использованию селекции объектов или ссылку в help, где есть пример. Использую vbs.

Link to comment
Share on other sites

Для начала нужно обновить 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

Link to comment
Share on other sites

Спасибо. То что нужно. При запуске примера заметил, что функция pt_toString не работает.

Link to comment
Share on other sites

Странно. При наличии чертежа, в котором есть линии, получается так:

 

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>

Link to comment
Share on other sites

Я тоже ждал такого вывода, но у меня только так:

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)

Link to comment
Share on other sites

  • 3 months later...

Здравствуйте. После переустановки нанокада на версию 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)

На работе все тоже самое, только лицензионное (установлена с лицензионного диска).

Link to comment
Share on other sites

После долгих попыток мне удалось зарегистрировать оба компонента на домашнем компе (регистрировал СОМ-объекты вручную с помощью команды regsvr32 *.dll, а потом добавлял компонент в vb проект). В результате это сработало, правда не с первого раза. Эту же процедуру проверил в Win7 - работает. А вот рабочий комп так и не поддается. ручная регистрация терпит неудачу. могу предположить что СОМ-объекты имеют какие-то зависимости от других библиотек, которых у меня на рабочем компе нет и из-за этогоь не проходит регистрация СОМ-объектов.

Прошу сообщить минимальный набор библиотек необходимый для регистрации nanoCAD Type Library и OdaX 3.04 Type library или предложить какой-то альтернативный путь решения проблемы.

Link to comment
Share on other sites

  • 4 weeks later...

Указанная мной проблема решилась в сборке 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 этот код работал)

Link to comment
Share on other sites

Есть предположение что OdaX 3.04 все же как-то неправильно зарегистрировался, потому как в интерфейсе nanoCAD.Document много интерфейсов из OdaX (в том числе и ModelSpace ) и все они помечены в visual studio как "интерфейс не зарегистрирован {Exception from HRESULT 0x80040155}

Заранее благодарен

Link to comment
Share on other sites

Сборка 1194 не отличается от сборки 1193 в части COM интерфейса. Видимо, дело в том, что Вы переустановили продукт.

Link to comment
Share on other sites

Попробуйте 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;

}

}

}

Link to comment
Share on other sites

спасибо, за быстрый ответ. помогло частично, есть один нюанс.

изначально пробовал ncad.exe/register под учетной записью не имеющей админских прав - проблемма осталась.

попробовал все тоже самое под учетной записью с правами администратора - все заработало.

причем и в 1 и во 2 случае nanoCAD Type Library 2.0 и OdaX в системе зарегистрировались (по крайней мере они доступны в visual studio по ссылке AddReference->COM), но не под админом интерфейсы OdaX работать не хотят - возникает ошибка выполнения при обращении к ним (компилируется код без проблем)

Это для меня критично, поскольку exe-шник откомпилированный и работающий под админской учетной записью не работает под учетными записями пользователей, а это важно (нельзя всем пользователям раздать админские права). Я попробовал расшарить папку где установлен нанокад для всех пользователей - не помогло.

может тут что-то посоветуете?

Link to comment
Share on other sites

  • 4 weeks later...

Дурацкий тут редактор. Зачем он окно очищает, спрашивается, когда в нем текст написан?

 

Думаю особо много предложений и не будет. Да и те будут почти сплошь тривиальными.

 

Если что, пользуются этой программой не программисты, малая часть из которых знают Visual Basic (остальные даже не считают его языком программирования). И не Web-дизайнеры, из которых большинство знакомы с java script или visual basic script.

Те же из программистов, которые ей пользуются, в большинстве используют ее для простого черчения (возможно в 3D), для чего имеющегося функционала и так более чем достаточно.

Если же придется реализовывать на базе nanoCAD какой-то крупный проект, то писаться модули будут скорее с использованием C/C++. И просто так их уже никто не выложит.

Link to comment
Share on other sites

да я и не прочь на С++ написать - это мой родной язык программирования. VB использую потому что изначально проект был на нем написан - не хочется переделывать. Пробовал цеплять библиотеки нанокада под С++, но там вываливается куча ошибок в h-файлах, не стал разбираться...

Кстати в версии 2.5 нанокада проблем с регистрацией компонентов под администартором/не администратором не было, так что я думаю не такая уж она и сложная (проблемма).

Link to comment
Share on other sites

Добрый день.

Перетаскиваю 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
       ^

Не понятно в чем дело (((

Link to comment
Share on other sites

проблему решил следующим образом: даешь пользователю админские права, регистирируешь библиотеки нанокад ncad.exe /register, отбираешь адмнские права у пользователя - так все работает.

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

  • 2 months later...

вопрос по созданию 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 рисуется нормально.

Link to comment
Share on other sites

  • 3 weeks later...

Вот пример работающего скрипта по созданию полилиний

 

 

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);

Link to comment
Share on other sites

вопрос по созданию 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 тоже. При использовании раннего связывания работает, а так нет.

В чем может быть дело?

Link to comment
Share on other sites

Вот пример работающего кода:

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;
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...