ISL Posted December 7, 2011 Report Share Posted December 7, 2011 проблему решил следующим образом: даешь пользователю админские права, регистирируешь библиотеки нанокад ncad.exe /register, отбираешь адмнские права у пользователя - так все работает. В nanoCAD 3.5 проблема решена. Теперь NCad.exe /register не требует админских прав, да и вручную теперь не нужно регистрацию вызывать, она происходит автоматически при первом запуске ярлыком под каждым пользователем. Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 5, 2012 Report Share Posted February 5, 2012 Я никак не могу получить координаты Dim point point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите начальную нижнюю левую точку") ThisDrawing.Utility.Prompt CStr(point(1)) Этот код не работает Quote Link to comment Share on other sites More sharing options...
ISL Posted February 6, 2012 Report Share Posted February 6, 2012 Нужно отконвертировать полученную точку в 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)) 1 Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 7, 2012 Report Share Posted February 7, 2012 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 Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 7, 2012 Report Share Posted February 7, 2012 И ещё вопросик. Как можно получить координаты об'ектов, если их выделить сразу несколько ? Quote Link to comment Share on other sites More sharing options...
ISL Posted February 7, 2012 Report Share Posted February 7, 2012 Почему в нижеследующем коде цикл выполняется только один раз? : 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..." 1 Quote Link to comment Share on other sites More sharing options...
ISL Posted February 7, 2012 Report Share Posted February 7, 2012 И ещё вопросик. Как можно получить координаты об'ектов, если их выделить сразу несколько ? Выделенные объекты попадают в ThisDrawing.PickfirstSelectionSet 1 Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 7, 2012 Report Share Posted February 7, 2012 (edited) И ещё вопросик. Как можно получить координаты об'ектов, если их выделить сразу несколько ? Выделенные объекты попадают в ThisDrawing.PickfirstSelectionSet А можно простой пример? И ещё как задать центровку выводимого текста? Нужно задать Выравнивание "Середина По центру" Edited February 7, 2012 by Cyr Quote Link to comment Share on other sites More sharing options...
alan_d Posted February 8, 2012 Report Share Posted February 8, 2012 Пример работы с 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? 1 Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 8, 2012 Report Share Posted February 8, 2012 (edited) А куда Вы выводите текст? Где задается выравнивание? В объектe Text? Текст надо выводить в центр квадрата. Выравнивание в объекте "однострочный текст" надо задать. Edited February 8, 2012 by Cyr Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 9, 2012 Report Share Posted February 9, 2012 (edited) Вообщем, благодаря примеру 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 February 11, 2012 by Cyr 1 Quote Link to comment Share on other sites More sharing options...
alan_d Posted February 9, 2012 Report Share Posted February 9, 2012 Такой команды нету. Невозможно предусмотреть все. Вам придется самому ее разработать. Нассчет выравнивания текста: у объекта текст есть свойство - Alignment оно отвечает за выравнивание. Посмотрите в справочной информации: %nanoCAD%/help/api/ncX_devguide.chm Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 9, 2012 Report Share Posted February 9, 2012 Нассчет выравнивания текста: у объекта текст есть свойство - Alignment оно отвечает за выравнивание. Посмотрите в справочной информации: %nanoCAD%/help/api/ncX_devguide.chm Да я в курсе. Только не знаю как это свойство задейстовать. Пробую так: var t = ThisDrawing.ModelSpace.AddText("А"+i,x+","+y+",0", h); t.Alignment(10); Не работает Quote Link to comment Share on other sites More sharing options...
dslava Posted February 14, 2012 Report Share Posted February 14, 2012 Все-таки тяжко на си писать, уж как я не пытался к нему приучиться, но не пошел он и все тут. Попробовал фрипаскаль, да что-то тоже не то, в итоге под фришку покатило только на асме, на нем все родное такое, как будто и не пересаживался на другую ось, вот еще транслятор форта допишу и вообще все шоколадно будет. Quote Link to comment Share on other sites More sharing options...
alan_d Posted February 15, 2012 Report Share Posted February 15, 2012 dslava - это вы о чем? мы тут на Си и не пишем. Материи у нас простые Quote Link to comment Share on other sites More sharing options...
alan_d Posted February 15, 2012 Report Share Posted February 15, 2012 (edited) Пробую так: 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 February 15, 2012 by alan_d Quote Link to comment Share on other sites More sharing options...
Cyr Posted February 21, 2012 Report Share Posted February 21, 2012 alan_d, нет не работает. Quote Link to comment Share on other sites More sharing options...
invapp Posted April 9, 2012 Report Share Posted April 9, 2012 why I can't find % nanoCAD% / help / api / ncX_devguide.chm? I am using 3.5 english version. Quote Link to comment Share on other sites More sharing options...
ISL Posted April 9, 2012 Report Share Posted April 9, 2012 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/. Quote Link to comment Share on other sites More sharing options...
Barbos Posted April 13, 2012 Report Share Posted April 13, 2012 (edited) Здравствуйте! Я xочу перевести свои приложения, написанные ранее для AutoCAD для работы в nanoCAD. Помогите разобраться, по-моему я что-то не так делаю... Делаю так: - В делфи выбираю Project - Import Type Library, в появившемся окне нажимаю Add и выбираю OdaX.tlb - При нажатии Install - ошибка "A class named TAcadDatabase is already installed", то бишь ругается на классы, импортированные ранее из Автокада. Соответственно никаких классов nanoCAD не импортируется. Как быть? Нельзя сделать так, чтобы одновременно присутствовали классы и autoCAD и nanoCAD? Если несложно, опишите пошаговое описание импорта и подключения к открытому документу... Извиняюсь, если вопрос глупый, я не программист, это просто хобби Edited April 13, 2012 by Barbos Quote Link to comment Share on other sites More sharing options...
ISL Posted April 17, 2012 Report Share Posted April 17, 2012 Названия COM интрфейсов nanoCAD и AutoCAD, действительно, одинаковы. Для того, чтобы одновременно их использовать, необходимо развести интерфейсы по пространствам имён. Я не знаю как устроены в Delphi пространства имён, в C++ в инструкции #import есть возможность импортировать как с пространствами имён, так и без них. Quote Link to comment Share on other sites More sharing options...
Barbos Posted April 18, 2012 Report Share Posted April 18, 2012 Названия COM интрфейсов nanoCAD и AutoCAD, действительно, одинаковы. Для того, чтобы одновременно их использовать, необходимо развести интерфейсы по пространствам имён. Спасибо, с импортом разобрался, теперь в ходе переделывания кода коплю вопросы по объектам Quote Link to comment Share on other sites More sharing options...
swell{d} Posted November 23, 2012 Report Share Posted November 23, 2012 (edited) может есть у кого пример работающего скрипта для рисования полилинии на 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 November 23, 2012 by swell{d} Quote Link to comment Share on other sites More sharing options...
Lion007 Posted November 23, 2012 Report Share Posted November 23, 2012 (edited) на 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 November 23, 2012 by Lion007 Quote Link to comment Share on other sites More sharing options...
swell{d} Posted November 28, 2012 Report Share Posted November 28, 2012 всё ещё жду пример для рисования полилинии 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.