Jump to content

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


Recommended Posts

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

В nanoCAD 3.5 проблема решена. Теперь NCad.exe /register не требует админских прав, да и вручную теперь не нужно регистрацию вызывать, она происходит автоматически при первом запуске ярлыком под каждым пользователем.

Link to comment
Share on other sites

  • 1 month later...

Я никак не могу получить координаты

Dim point
point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите начальную нижнюю левую точку")
ThisDrawing.Utility.Prompt CStr(point(1))

Этот код не работает :(

Link to comment
Share on other sites

Нужно отконвертировать полученную точку в SafeArray

 

Dim point, point_sa
point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите начальную нижнюю левую точку")
point_sa = ThisDrawing.Utility.CreateSafeArrayFromVector(point)
ThisDrawing.Utility.Prompt CStr(point_sa(1))

  • Like 1
Link to comment
Share on other sites

ISL, спасибо.

 

Почему в нижеследующем коде цикл выполняется только один раз? :

 

Dim i, point, point_sa, otext
For i = 0 To 9
point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите начальную нижнюю левую точку")
point_sa = ThisDrawing.Utility.CreateSafeArrayFromVector(point)
ThisDrawing.Utility.Prompt CStr(point_sa(0)) & " " & CStr(point_sa(1))
otext = ThisDrawing.ModelSpace.AddText("100", point, 500)
next

Link to comment
Share on other sites

Почему в нижеследующем коде цикл выполняется только один раз? :

 

Dim i, point, point_sa, otext
For i = 0 To 9
point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите начальную нижнюю левую точку")
point_sa = ThisDrawing.Utility.CreateSafeArrayFromVector(point)
ThisDrawing.Utility.Prompt CStr(point_sa(0)) & " " & CStr(point_sa(1))
otext = ThisDrawing.ModelSpace.AddText("100", point, 500)
next

 

Заработает, если написать "set otext = ThisDrawing..."

  • Like 1
Link to comment
Share on other sites

И ещё вопросик. Как можно получить координаты об'ектов, если их выделить сразу несколько ?

 

Выделенные объекты попадают в ThisDrawing.PickfirstSelectionSet

  • Like 1
Link to comment
Share on other sites

И ещё вопросик. Как можно получить координаты об'ектов, если их выделить сразу несколько ?
Выделенные объекты попадают в ThisDrawing.PickfirstSelectionSet

А можно простой пример?

 

И ещё как задать центровку выводимого текста? Нужно задать Выравнивание "Середина По центру"

Edited by Cyr
Link to comment
Share on other sites

Пример работы с PickfirstSelectionSet.

В цикле перебираем все объекты, содержащиеся в наборе селекции, и что-то с каждым из них делаем. Например спрашиваем имя объекта. Вместо этого Вам нужно спрашивать их координаты.

var psf = ThisDrawing.PickfirstSelectionSet;
var entNames = "";
for(var i=0; i < psf.Count; ++i)
{
var entityObject = psf.Item(i); // получаем объект из селекции
// entityObject.smtMethod();	// делаем с ним что-то, например:
entNames += entityObject.ObjectName + "; ";
}
ThisDrawing.Utility.Prompt("Предварительный выбор содержит следующие объекты: " + entNames);
ThisDrawing.Utility.Prompt("Общее число объектов: " + psf.Count);
var ptMin = new Array();
var ptMax = new Array();
psf.GetBoundingBox(ptMin, ptMax);
ThisDrawing.Utility.Prompt("Границы всей селектированной зоны: ");
var tMin = ThisDrawing.Utility.CreateSafeArrayFromVector(ptMin[0]);
var tMax = ThisDrawing.Utility.CreateSafeArrayFromVector(ptMax[0]);
var pointMin = tMin.toArray();
var pointMax = tMax.toArray();
ThisDrawing.Utility.Prompt("Первая точка границы зоны селекции X: " + pointMin[0] + "; Y: " + pointMin[1] + "; Z:" + pointMin[2]);
ThisDrawing.Utility.Prompt("Вторая точка границы зоны селекции X: " + pointMax[0] + "; Y: " + pointMax[1] + "; Z:" + pointMax[2])

А можно простой пример? И ещё как задать центровку выводимого текста? Нужно задать Выравнивание "Середина По центру"

 

А куда Вы выводите текст? Где задается выравнивание? В объектe Text?

  • Like 1
Link to comment
Share on other sites

А куда Вы выводите текст? Где задается выравнивание? В объектe Text?

Текст надо выводить в центр квадрата. Выравнивание в объекте "однострочный текст" надо задать.

Edited by Cyr
Link to comment
Share on other sites

Вообщем, благодаря примеру alan_d у меня получился такой вот "сырой" код:

var psf = ThisDrawing.PickfirstSelectionSet;
for(var i=0; i < psf.Count; ++i)
{
var entityObject = psf.Item(i); // получаем объект из селекции
var ptMin = new Array(); // левая нижняя точка объекта
var ptMax = new Array(); // правая верхняя точка объекта
entityObject.GetBoundingBox(ptMin, ptMax); //получить эти точки
var tMin = ThisDrawing.Utility.CreateSafeArrayFromVector(ptMin[0]);
var tMax = ThisDrawing.Utility.CreateSafeArrayFromVector(ptMax[0]);
var pointMin = tMin.toArray(); // координаты левой нижней точки объекта
var pointMax = tMax.toArray(); // координаты правой верхней точки объекта
ThisDrawing.Utility.Prompt("Границы объекта: " + entityObject.ObjectName);
ThisDrawing.Utility.Prompt("Первая точка границы объекта X: " + pointMin[0] + "; Y: " + pointMin[1] + "; Z:" + pointMin[2]);
ThisDrawing.Utility.Prompt("Вторая точка границы объекта X: " + pointMax[0] + "; Y: " + pointMax[1] + "; Z:" + pointMax[2]);


// Вычисляем координаты центра для текста
var x1 = pointMin[0];
var y1 = pointMin[1];
var x2 = pointMax[0];
var y2 = pointMax[1];
var x = (x2-x1)/3+x1;
var y = (y2-y1)/3+y1;
var h = (y2-y1)/3
// пишем на объекте номер
ThisDrawing.ModelSpace.AddText("А"+i,x+","+y+",0", h);
}

Он пронумеровывает объекты. Беда только в том, что нумерация объектов получается несколько хаотичной.

Нужно отсортировать объекты в селекции так, чтобы они нумеровались рядами снизу вверх.

Есть ли в NanoCAD команда сортировки объектов в селекции по координатам?

Edited by Cyr
  • Like 1
Link to comment
Share on other sites

Такой команды нету. Невозможно предусмотреть все. Вам придется самому ее разработать.

 

Нассчет выравнивания текста: у объекта текст есть свойство - Alignment оно отвечает за выравнивание. Посмотрите в справочной информации: %nanoCAD%/help/api/ncX_devguide.chm

Link to comment
Share on other sites

Нассчет выравнивания текста: у объекта текст есть свойство - Alignment оно отвечает за выравнивание. Посмотрите в справочной информации: %nanoCAD%/help/api/ncX_devguide.chm

Да я в курсе. Только не знаю как это свойство задейстовать.

Пробую так:

var t = ThisDrawing.ModelSpace.AddText("А"+i,x+","+y+",0", h);
t.Alignment(10);

Не работает :(

Link to comment
Share on other sites

Все-таки тяжко на си писать, уж как я не пытался к нему приучиться, но не пошел он и все тут. Попробовал фрипаскаль, да что-то тоже не то, в итоге под фришку покатило только на асме, на нем все родное такое, как будто и не пересаживался на другую ось, вот еще транслятор форта допишу и вообще все шоколадно будет.

Link to comment
Share on other sites

Пробую так:

var t = ThisDrawing.ModelSpace.AddText("А"+i,x+","+y+",0", h);
t.Alignment(10);

Не работает :(

 

Попробуйте так:

var t = ThisDrawing.ModelSpace.AddText("А"+i,x+","+y+",0", h);
t.Alignment = 10;

Edited by alan_d
Link to comment
Share on other sites

  • 1 month later...

Please speak Russian in this forum. We have English speaking forum at http://forum.nanocad.com/.

 

I've added your question and my reply to the FAQ section in the English forum.

 

В дистрибутив английской версии nanoCAD не входит документация API. Для получения доступа к SDK, документации по API и поддержке разработчиков необходимо вступить в Клуб разработчиков nanoCAD, который, как и форум, существует на двух языках: русском http://developer.nanocad.ru/, и английском http://developer.nanocad.com/.

Link to comment
Share on other sites

Здравствуйте!

 

Я xочу перевести свои приложения, написанные ранее для AutoCAD для работы в nanoCAD. Помогите разобраться, по-моему я что-то не так делаю...

 

Делаю так:

- В делфи выбираю Project - Import Type Library, в появившемся окне нажимаю Add и выбираю OdaX.tlb

- При нажатии Install - ошибка "A class named TAcadDatabase is already installed", то бишь ругается на классы, импортированные ранее из Автокада. Соответственно никаких классов nanoCAD не импортируется. Как быть? Нельзя сделать так, чтобы одновременно присутствовали классы и autoCAD и nanoCAD? Если несложно, опишите пошаговое описание импорта и подключения к открытому документу...

 

Извиняюсь, если вопрос глупый, я не программист, это просто хобби :)

Edited by Barbos
Link to comment
Share on other sites

Названия COM интрфейсов nanoCAD и AutoCAD, действительно, одинаковы. Для того, чтобы одновременно их использовать, необходимо развести интерфейсы по пространствам имён.

 

Я не знаю как устроены в Delphi пространства имён, в C++ в инструкции #import есть возможность импортировать как с пространствами имён, так и без них.

Link to comment
Share on other sites

Названия COM интрфейсов nanoCAD и AutoCAD, действительно, одинаковы. Для того, чтобы одновременно их использовать, необходимо развести интерфейсы по пространствам имён.

Спасибо, с импортом разобрался, теперь в ходе переделывания кода коплю вопросы по объектам :)

Link to comment
Share on other sites

  • 7 months later...

может есть у кого пример работающего скрипта для рисования полилинии на vbs? никак не получается разобраться.

 

пробую так:

Dim ms
Set ms = ThisDrawing.ModelSpace
Dim ut
Set ut = ThisDrawing.Utility
Dim point, point_sa
Dim xx
Dim yy
point = ut.GetPoint("0,0,0", "Укажите точку вставки")
point_sa = ut.CreateSafeArrayFromVector(point)
xx = int(point_sa(0))
yy = int(point_sa(1))
Dim oLine
Set oLine = ms.AddPolyLine(Cstr(xx)+","+Cstr(yy)+","+Cstr(0),Cstr(xx+100)+","+Cstr(yy+100)+","+CStr(0))

Edited by swell{d}
Link to comment
Share on other sites

на JS писал вот тут : http://forum.nanocad.ru/index.php?showtopic=5010 там же и на VB куски есть...

 


var fso = new ActiveXObject("Scripting.FileSystemObject");
var ts = fso.OpenTextFile("c:\\coords.txt", 1);
var done = false;
var re = /\s*,\s*/ // regular expression - splits by "," & remove unneeded spaces
var pline_coords = new Array();
while (!done && !ts.AtEndOfStream)
{
 var s = ts.ReadLine();
 var sCoords = s.split(re);
 if (sCoords.length < 2)
 {
	done = true;
 } else
 {
	pline_coords[pline_coords.length] = Number(sCoords[0]); // x coordinate
	pline_coords[pline_coords.length] = Number(sCoords[1]); // y coordinate
	if (sCoords.length > 2)
	  pline_coords[pline_coords.length] = Number(sCoords[2]); // z coordinate if exist
	else
	  pline_coords[pline_coords.length] = 0;				  // z coordinate omited
 }
}
var pline_pts = ThisDrawing.Utility.CreateTypedArrayFromJSArray(5, pline_coords);
ThisDrawing.ModelSpace.AddPolyline(pline_pts);

читает вот такие файлики (2 и 3 координаты на точку)

 

0, 0
100, 0
100, 100
0, 100
0, 0

перевод на VB - в качестве домашнего задания :)

Edited by Lion007
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...