С# + AutoCAD для "носорогов".
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > С# + AutoCAD для "носорогов".

С# + AutoCAD для "носорогов".

Ответ
Поиск в этой теме
Непрочитано 08.05.2014, 16:33 #1
С# + AutoCAD для "носорогов".
alex8888
 
Инженер
 
Deutschland
Регистрация: 27.04.2009
Сообщений: 208

Как мне справедливо намекнули в соседней теме, VB.Net немного отличается от шарпея, поэтому предлагаю здесь уважаемым гуру высказать свое "фи" не менее уважаемым чайникам и поиздеваться над ними.

Итак у меня возникло желание создать примитив посредством программы на C#. В качестве примера подвернулся код для создания команды рисования линии - проще уж совсем некуда:
Код:
[Выделить все]
 01	#region "Imports"
02	//system
03	using System;
04	using System.Collections.Generic;
05	using System.Text;
06	using System.IO;
07	using System.Threading;
08	using System.Globalization;
09	using System.Runtime.InteropServices;
10	using System.Diagnostics;
11	using System.Collections;
12	//acad
13	using Autodesk.AutoCAD.ApplicationServices;
14	using Autodesk.AutoCAD.DatabaseServices;
15	using Autodesk.AutoCAD.EditorInput;
16	using Autodesk.AutoCAD.Runtime;
17	using Autodesk.AutoCAD.Geometry;
18	#endregion
19	 
20	 
21	namespace AddLine
22	{
23	    public class Class1
24	    {
25	        [CommandMethod("AddLine")]
26	        public static void AddLine()
27	 
28	        {
29	            double x1; double y1; double x2; double y2;
30	            x1 = 0; y1 = 0; x2 = 200; y2 = 400;
31	            //Получение текущего документа и базы данных чертежа
32	            Document acDoc = Application.DocumentManager.MdiActiveDocument;
33	            Database acCurDb = acDoc.Database;
34	            //Начало транзакции
35	            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
36	            {
37	                //Открыть таблицу блоков для чтения
38	                BlockTable acBlkTbl;
39	                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
40	                                                  OpenMode.ForRead) as BlockTable;
41	 
42	                //Открыть таблицу блоков пространства модели для записи
43	                BlockTableRecord acBlkTblRec;
44	                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
45	                                                     OpenMode.ForWrite) as BlockTableRecord;
46	 
47	                // Создание линии по точкам x1,y1 и x2,y2
48	                Line acLine = new Line(new Point3d(x1, y1, 0),new Point3d(x2, y2, 0));
49	                acLine.SetDatabaseDefaults();
50	 
51	                // Добавление нового объекта в базу и транзакция
52	                acBlkTblRec.AppendEntity(acLine);
53	                acTrans.AddNewlyCreatedDBObject(acLine, true);
54	 
55	                // Сохранение нового объекта в базе данных чертежа
56	                acTrans.Commit();
57	            }
58	        }
59	    }
60	}
При жестком указании координат работает на ура.

Boxa показал как сделать, чтобы точки начала-конца линии указывались путем "тыка" на чертеже:

Код:
[Выделить все]
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using App = Autodesk.AutoCAD.ApplicationServices;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gem = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

// [assembly: Rtm.CommandClass(typeof(MyClassSerializer.Commands))]

namespace AddLine
{
    public class Commands
    {
        [Rtm.CommandMethod("AddLine")]
        static public void AddLine()
        {
            // Получение текущего документа и базы данных
            App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database acCurDb = acDoc.Database;

            Ed.PromptPointOptions p1Opt = new Ed.PromptPointOptions("\nУкажите первую точку:");
            Ed.PromptPointResult p1Res = acDoc.Editor.GetPoint(p1Opt);
                if (p1Res.Status != Ed.PromptStatus.OK)
                    return;

            Ed.PromptPointOptions p2Opt = new Ed.PromptPointOptions("\nУкажите вторую точку:");
            p2Opt.BasePoint = p1Res.Value;
            p2Opt.UseBasePoint = true;
            Ed.PromptPointResult p2Res = acDoc.Editor.GetPoint(p2Opt);
            if (p2Res.Status != Ed.PromptStatus.OK)
                return;           
            
            // старт транзакции
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Открытие таблицы Блоков для чтения
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;

                // Открытие записи таблицы Блоков пространства Модели для записи
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                                Db.OpenMode.ForWrite) as Db.BlockTableRecord;
                // Создание отрезка
                Db.Line acLine = new Db.Line(p1Res.Value, p2Res.Value);
                acLine.SetDatabaseDefaults();
                // Добавление нового объекта в запись таблицы блоков и в транзакцию
                acBlkTblRec.AppendEntity(acLine);
                acTrans.AddNewlyCreatedDBObject(acLine, true);
                // Сохранение нового объекта в базе данных
                acTrans.Commit();
            }
        }
    }
}
При этом у меня не совсем вышло, выдает ошибку на строке
Цитата:
using System.Threading.Tasks;
- нет такой сборки (где ее искать?)

Остался вопрос как вбивать координаты точек при выполнении команды вручную или передать в качестве параметров из другой команды/программы или диалогового окна? Типа выполнить "AddLine(0,0,100,100), где числа в скобках - точки x1,y1,x2,y2.

Кому то это просто, а у меня что то не ухватывается способ достичь результата.
Просмотров: 11492
 
Непрочитано 08.05.2014, 16:48
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


ИХМО Ваши вопросы от незнания C# как такового - к автокаду они пока мало относятся.
з.ы. Я в общем не так категоричен - для меня точно нет разницы на каком .Net языке посмотреть метод решения проблемы под автокад. Тем более у C# и VB семантика абсолютно одинаковая - можете погуглить есть автоматизированные переводчики кода из одного в другое - можно туда и обратно перевсети - код не изменится - то есть практически это два одинаковых языка просто различный синтаксис (алфавит) и правила оформления (группировки).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 08.05.2014, 17:13
#3
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Почему же тогда на System.Threading.Tasks ругается? У меня VS-Express 2012. В помощи Task - класс есть, а в программе нет.

Цитата:
к автокаду они пока мало относятся
То есть рисование примитивов в автоКаде - это не относится к последнему??
Я специально выбрал, что попроще.
Отвлеченные программы как оказалось составлять не так сложно, нежели сделать библиотеку для Када. По крайней мере для меня в данный момент.
Практически от чего то оттолкнуться - дальше по течению вынесет.
alex8888 вне форума  
 
Непрочитано 08.05.2014, 17:15
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Да, согласен с Дима_, тут еще учиться и учиться...
Цитата:
Сообщение от alex8888 Посмотреть сообщение
- нет такой сборки (где ее искать?)
А не надо ее искать, она тут лишняя. Удалить/закомментировать.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Остался вопрос как вбивать координаты точек при выполнении команды вручную или передать в качестве параметров из другой команды/программы или диалогового окна? Типа выполнить "AddLine(0,0,100,100), где числа в скобках - точки x1,y1,x2,y2.
Выносите построение отрезка в отдельный метод с параметрами. Командный метод можно будет тогда переписать, чтобы после получения точек вызывался метод с параметрами.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 08.05.2014, 17:18
#5
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от alex8888 Посмотреть сообщение
При этом у меня не совсем вышло, выдает ошибку на строке
Цитата:
using System.Threading.Tasks;
- нет такой сборки (где ее искать?)
Тебе эти сборки не нужны, просто закоментируй их.
Код:
[Выделить все]
using System;
using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;

Цитата:
Сообщение от alex8888 Посмотреть сообщение
Остался вопрос как вбивать координаты точек при выполнении команды вручную
Так же как и при рисовании командой _line? т.е.:
0,0,0 Enter
10,10,0 Enter
тут видео: http://youtu.be/tKnqsROP8bg

Дима_, Полностью согласен.
И в своем шутливом замечании я именно шутил, а не призвал еще одну тему открывать.
Boxa вне форума  
 
Автор темы   Непрочитано 08.05.2014, 17:32
#6
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от Boxa Посмотреть сообщение
Тебе эти сборки не нужны, просто закоментируй их.

Дима_, Полностью согласен.
И в своем шутливом замечании я именно шутил, а не призвал еще одну тему открывать.

1. Для чего то ты все же вставил эту сборку. У меня такой не было.

2. Может кому понадобится именно C#, а не VB. Даже при наличии конверторов и похожести.

Код сработал и без Task. Это понятно. Спасибо.

Следующий шаг
Цитата:
Выносите построение отрезка в отдельный метод с параметрами.
Если будет маленький пример на основе приведенных кодов - в смысле указать, где принципиальные отличия, что добавить, что убрать - буду очень признателен.
Для первой поры пойдет. Я уже смогу строить также и окружности и прочие элементы.
Все таки Шарп "немного" непривычен после Лиспа.
alex8888 вне форума  
 
Непрочитано 08.05.2014, 17:39
#7
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


ну, с почином. торжественное событие для начинающих шарпистов. собственная тема! Жаль hwd "не дожил" до этого момента!
gomer вне форума  
 
Автор темы   Непрочитано 08.05.2014, 17:42
#8
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от gomer Посмотреть сообщение
ну, с почином. торжественное событие для начинающих шарпистов. собственная тема! Жаль hwd "не дожил" до этого момента!
Издеваешься
А почему hwd не дожил?

Кстати, сам пользуешься C#?
alex8888 вне форума  
 
Непрочитано 08.05.2014, 17:42
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от gomer Посмотреть сообщение
ну, с почином. торжественное событие для начинающих шарпистов. собственная тема! Жаль hwd "не дожил" до этого момента!
Он до целого отдельного форума дожил =) Тут: http://adn-cis.org/forum/index.php?board=4.0
Там теперь и сидит =)


alex8888, вообще то, это азы.
Код:
[Выделить все]
 
using App = Autodesk.AutoCAD.ApplicationServices;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gem = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

namespace AddLine
{
    public class Commands
    {
        [Rtm.CommandMethod("AddLine")]
        static public void AddLine()
        {
            // Получение текущего документа и базы данных
            App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database acCurDb = acDoc.Database;

            Ed.PromptPointOptions p1Opt = new Ed.PromptPointOptions("\nУкажите первую точку:");
            Ed.PromptPointResult p1Res = acDoc.Editor.GetPoint(p1Opt);
                if (p1Res.Status != Ed.PromptStatus.OK)
                    return;

            Ed.PromptPointOptions p2Opt = new Ed.PromptPointOptions("\nУкажите вторую точку:");
            p2Opt.BasePoint = p1Res.Value;
            p2Opt.UseBasePoint = true;
            Ed.PromptPointResult p2Res = acDoc.Editor.GetPoint(p2Opt);
            if (p2Res.Status != Ed.PromptStatus.OK)
                return;

            AddLineToModalSpace(p1Res.Value, p2Res.Value);
        }


        static private void AddLineToModalSpace(Gem.Point3d p1, Gem.Point3d p2)
        {
            // Получение текущего документа и базы данных
            App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database acCurDb = acDoc.Database;
            // старт транзакции
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Открытие таблицы Блоков для чтения
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;

                // Открытие записи таблицы Блоков пространства Модели для записи
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                                Db.OpenMode.ForWrite) as Db.BlockTableRecord;

                // Создание отрезка 
                Db.Line acLine = new Db.Line(p1, p2);
                acLine.SetDatabaseDefaults();
                // Добавление нового объекта в запись таблицы блоков и в транзакцию
                acBlkTblRec.AppendEntity(acLine);
                acTrans.AddNewlyCreatedDBObject(acLine, true);
                // Сохранение нового объекта в базе данных
                acTrans.Commit();
            }
        }
    }
}
Boxa вне форума  
 
Автор темы   Непрочитано 08.05.2014, 17:51
#10
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от Boxa Посмотреть сообщение
вообще то, это азы.
Я и не говорил ничего против. Однако использование шарпа в каде уже не совсем азы. Другое дело оконные или терминальные приложения.

За код спасибо. Теперь многое прояснилось.
За ссылку отдельное спасибо. А то я потерял нить от hwd. На прежнем месте его нет. Теперь снова есть!
alex8888 вне форума  
 
Непрочитано 08.05.2014, 21:44
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Издеваешься
Совсем .Net
Такой темы мне очень не хватало, когда я пытался освоить это дело.
Unfortunately (вот нравится это слово) ситуация сложилась так, что теперь мне .нет, как козе гравицапа
gomer вне форума  
 
Автор темы   Непрочитано 09.05.2014, 00:34
#12
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от gomer Посмотреть сообщение
Unfortunately (вот нравится это слово) ситуация сложилась так, что теперь мне .нет, как козе гравицапа
чего?
alex8888 вне форума  
 
Автор темы   Непрочитано 14.05.2014, 09:35
#13
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Ребята, подскажите, пожалуйста не в службу, а в дружбу.
Вот например такой список:
Код:
[Выделить все]
 ((-1 . <Objektname: 7ffffb36510>) (0 . "TEXT") (330 . <Objektname: 7ffffb039f0>) (5 . "D4BA9") (100 . "AcDbEntity") (67 . 0) (410 . "Model")
 (8 . "schrift") (100 . "AcDbText") (10 11247.9 -6712.83 0.0) (40 . 30.0) (1 . "Stutzen D=168.3x6 auf Kopf d=219.1x6") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "STANDARD")
(71 . 0) (72 . 4) (11 11582.0 -6702.33 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 0))
каким образом обрабатывается с помощью средств C# и Автокад? Как будет выглядеть команда для создания объекта по такому списку?
Это чисто спортивный интерес. Есть ли какое преимущество в таком подходе к созданию и манипулированию объектами?
Есть тут ограничения, подводные камни и тп? Интересно ваше мнение.
alex8888 вне форума  
 
Непрочитано 14.05.2014, 10:33
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Как будет выглядеть команда для создания объекта по такому списку?
Боюсь никак (можно извратиться и послать "команду" лиспу из С# чтоб он создал примитив) - это списочное лисп-представление DXF кодов примитива.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Интересно ваше мнение.
Вам не хватает теоритической подготовки.
з.ы. формально можно передать этот список .Net плагину, обработать его и на его основе что-то создать - но это как шуроповертом гвозди забивать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.05.2014, 10:39
#15
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от Дима_ Посмотреть сообщение
можно извратиться и послать "команду" лиспу из С# чтоб он создал примитив
Примерчик не подкинешь? Если не в лом, конечно.

Offtop:
Цитата:
Вам не хватает теоритической подготовки.
Ее и не будет, если ничего не начинать делать.
alex8888 вне форума  
 
Непрочитано 14.05.2014, 12:08
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Если не в лом, конечно
Заниматься НИКОМУ не нужным делом - чтоб показать что это таки можно - примените этот список к функции entmakex - и она создаст Вам примитив (если коды взяты из тойже сессии и пр). Хотите из под C# удалите коды с примитивами (-1, 330 и др.) - и передайте список строкой.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Ее и не будет, если ничего не начинать делать.
Но и бредовые телодвижения ее не улучшают.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.05.2014, 12:22
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Я в С# вообще новичок, но написав эту фигню стер к чертям. Это бред сивой кобылы. Никакого отношения к программированию под акад не имеет.
90% кода, это парсинг строки и вычленение требуемых значений, которые потом задаются вновь создаваемому примитиву.

В общем дурь. ИМХО я понимаю что Вы, Алекс8888, привыкли писать на ЛИСП, но если Вы взялись изучать новую платформу, то изучайте именно ее, а не пытайтесь писать на лисп используя синтаксис С#
Boxa вне форума  
 
Автор темы   Непрочитано 14.05.2014, 12:35
#18
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Boxa, спасибо.
Действительно, до сих пор все у меня на лиспе, но есть задумки, с которыми лисп не справится. Поэтому хотелось бы, чтобы была обратная связь - прога на c# или т.п. и плюс ко всему дополнительно построение в автокад. Поэтому и смотрю, а не будет ли такой подход лучше, пусть хоть и через задний проход. Пусть идеи бредовые - мне же только для себя и нужно - за звездами гнаться не за чем.
alex8888 вне форума  
 
Непрочитано 14.05.2014, 13:25
1 | #19
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Ребята, подскажите, пожалуйста не в службу, а в дружбу.
Вот например такой список:
Код:
[Выделить все]
 ((-1 . <Objektname: 7ffffb36510>) (0 . "TEXT") (330 . <Objektname: 7ffffb039f0>) (5 . "D4BA9") (100 . "AcDbEntity") (67 . 0) (410 . "Model")
 (8 . "schrift") (100 . "AcDbText") (10 11247.9 -6712.83 0.0) (40 . 30.0) (1 . "Stutzen D=168.3x6 auf Kopf d=219.1x6") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "STANDARD")
(71 . 0) (72 . 4) (11 11582.0 -6702.33 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 0))
каким образом обрабатывается с помощью средств C# и Автокад?
В контексте NET это будет не список а объект типа ResultBuffer. Получить из объекта его можно с помощью P/Invoke: http://adn-cis.org/zerkalnoe-otobraz...-(dbtext).html
Внутри он содержит коллекцию объектов TypedValue - аналог точечной пары на лиспе.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Как будет выглядеть команда для создания объекта по такому списку?

Цитата:
Сообщение от alex8888 Посмотреть сообщение
Есть ли какое преимущество в таком подходе к созданию и манипулированию объектами?
Если получится создать - опишитесь, мне будет интересно. А там уже обсудим преимущества и недостатки
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Есть тут ограничения, подводные камни и тп?
Одно большое ограничение - нет нормальных NET методов для получения entget - представления. Поэтому, приходится извращаться с P/Invoke. Про создание объекта из entget - представления я пока не слышал, и мне не нужно было это ни разу.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 15.05.2014, 11:00
#20
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от Do$ Посмотреть сообщение
Если получится создать - опишитесь, мне будет интересно. А там уже обсудим преимущества и недостатки
С применением SendStringToExecute показалось вполне приемлемым и не сложным:
Код:
[Выделить все]
 string x="'((0 . \"circle\")(62 . 1)(10 0 0 0)(40 . 300))";
            string y="'((0 . \"circle\")(62 . 8)(10 0 0 0)(40 . 500))";
            acDoc.SendStringToExecute("(entmake" + x + ") ", true, false, false);
            acDoc.SendStringToExecute("(entmakex" + y + ") ", true, false, false);
Здесь как пример прорисовка окружностей с заданными значениями.
Вместо x и y можно будет подставить нужный список, который можно создать на основе данных, полученных из диалогового окна.
Кроме того как я понял, таким образом вообще можно вызывать на выполнение лисповские функции, что на первых порах стало бы большим подспорьем, потому что переписывать все на шарп довольно-таки затратно.
alex8888 вне форума  
 
Непрочитано 15.05.2014, 11:07
#21
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Сотроите этот код - пока его какие-нибудь умники за чистую монету не приняли.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Кроме того как я понял, таким образом вообще можно вызывать на выполнение лисповские функции
Откройте для себя аттрибут LispFunction и вызывайте из лиспа все что Вы на C# "накалякали"
з.ы. Вот блин "подсказал" как можно сдуру...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.05.2014, 11:25
#22
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сотрите этот код
почему? Что здесь не правильно? Вроде бы тоже функция.

LispFunction это из лиспа или С#? В каком разделе справки синтаксис и свойства смотреть?

Цитата:
из лиспа все что Вы на C#
, а если наоборот, то как?
alex8888 вне форума  
 
Непрочитано 15.05.2014, 11:36
#23
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от alex8888 Посмотреть сообщение
почему? Что здесь не правильно? Вроде бы тоже функция.
Вы мне можете просто на слово поверить?
Цитата:
Сообщение от alex8888 Посмотреть сообщение
В каком разделе справки синтаксис и свойства смотреть?
Например здесь
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.05.2014, 11:44
#24
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Вы мне можете просто на слово поверить?
Конечно, я Вам верю. Но для этого у Вас есть серьезные основания, как я полагаю, которые мне не известны.
Использование приведенного мною подхода просто моветон или влечет за собой плачевные последствия применения?

За справку спасибо, ее я тоже нашел, но там с примером пока ни фига не понятно.
alex8888 вне форума  
 
Непрочитано 15.05.2014, 11:47
#25
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Вот тут http://through-the-interface.typepad...using-net.html
можно посмотреть пример создания и вызова такого рода функций.

Вот здесь можно на русском посмотреть : https://sites.google.com/site/bushma...j-s-xml-fajlom
Boxa вне форума  
 
Автор темы   Непрочитано 15.05.2014, 11:54
#26
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Boxa, спасибо.
Этой функцией я уже давно пользуюсь.

Но мне не надо создавать новую Лисп-функцию, а надо просто вызвать уже готовую - типа например такой:
Цитата:
(langloch '(20,30,40,50,90,nil,10))

Кстати, по первой ссылке показан примерно такой же подход, что и у меня, через acDoc.SendStringToExecute
alex8888 вне форума  
 
Непрочитано 15.05.2014, 12:12
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Конечно, я Вам верю.
Это радует.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Использование приведенного мною подхода просто моветон или влечет за собой плачевные последствия применения?
В данном случе одно другого не исключает.
Есть несколько технологий програмной работы с автокадом, у каждой свои плюсы и минусы. В зависимости от задачи, решение по одной из технологий, может лучше подходить чем другие. Действительно бывают задачи, для которых оптимальной является "скрещенная" работа, но то что делаете Вы - это берете худшее из технологий и пытаетесь скрестить их между собой, да еще и наихудшим методом - я понимаю, что это от незнания как это правильно делать.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
За справку спасибо, ее я тоже нашел, но там с примером пока ни фига не понятно.
А вы не открывайте книжки с середины в которых ВСЕ что написанно является для Вас новым. Перед тем как лезть в программирование под .Net AutoCAD неплохо ознакомится просто с "базовым" программированием под .Net; потом прочитать как реализованно взаимодействие с API автокада. Между лиспом и .Net API пропасть (не в том смысле, что что-то хуже, а просто устроенно все очень по разному) - и Ваши знания Автолиспа, пока больше вредят освоить материал, нежели помогают.

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Но мне не надо создавать новую Лисп-функцию, а надо просто вызвать уже готовую - типа например такой:
(langloch '(20,30,40,50,90,nil,10))
Программирование на автолиспе - это более абстрактный уровень, чем .Net API, написанна функция на лиспе - ее от туда и вызывайте + можете "расширить" лисп функционал дополнительными функциями на .Net. Есть еще несколько вариантов вызова лисп функций из .Net - но на этот раз я Вам их говорить не буду, и других прошу о том же, дабы не портить Ваше сознание неверным представлением.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 15.05.2014 в 12:19.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.05.2014, 12:39
#28
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Попытаюсь оправдаться. Может быть станет более понятным мое положение. И Вы подскажете направления развития.
1.Итак, к примеру, есть WPF-приложение типа справочно-нормативного (фланцы по нормам, не суть важно каким, но их много, собраны в базу данных, потом планирую добавить другие элементы трубопроводов) - визуально представлены размеры, вид, нужная информация.
2.К нему хочу прикрутить возможность прорисовки выбранного элемента на чертеже (в дальнейшем будут не только стандартные, но очень специфические изделия, изменяющиеся произвольно по вводимым данным) на чертеже - по первости в Автокад, по возможности в дальнейшем и в Инвентор.
3.Есть уже не один десяток написанных на Лиспе модулей, которые можно также использовать для реализации п.2
Подчеркну, что п.2 не является главенствующим и не всегда нужны построения элементов и чертежи, но иногда требуется работа с документами, использующими данные из п.1

Рисовать функционалом C# может быть пока и не оправдано, а остальные составляющие проекта не реализуются в Автокаде на Лиспе.

Теперь немного прояснил ситуацию? Есть предложения?
alex8888 вне форума  
 
Непрочитано 15.05.2014, 12:44
#29
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Есть предложения?
Есть. Использовать специализированное ПО: если вопрос касается строительства, то AutoCAD MEP или Revit MEP; если машиностроение - Inventor Suite (например).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2014, 12:57
#30
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть. Использовать специализированное ПО: если вопрос касается строительства, то AutoCAD MEP или Revit MEP; если машиностроение - Inventor Suite (например)
Это точно не годится.
1. Функционал абсолютно не тот. Есть все, что не нужно и наоборот. Специфика производства, что поделаешь.
2. Самый важный пункт- деньги. Мне будет проще добиться повышения зарплаты чем приобретения спец-ПО. Тем более, что Инвентор у меня таки есть. По "глюкавости" он бежит впереди всех моих творений на пол-головы
Понимаю, что из-за универсальности страдает функционал, но нельзя же так грубо фальшивить - ни одна развертка нормально не реализуется. (Может быть свойство наших машин и инструментов - но что есть, то есть и другого не дано)
alex8888 вне форума  
 
Непрочитано 15.05.2014, 13:34
1 | #31
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Тогда пишется "мостик" Lisp<->.Net и каждый занимается своим делом, лисп вызывает лисп-функцию с параметрами полученными от WPF модуля, при желании можно в качестве параметров и текст функции передать, и выполнить ее через apply/eval (но с этим аккуратней, в автолиспе нет именных пространств - я сейчас про пространства лиспа, а не .Net) - но для грамотного составления "интерфейса" обмена между модулями - нужны достаточно продвинутые знания в обоих областях. Плюс надо обязательно рассмотреть взаимодействие через ActiveX (сборки Autodesk.AutoCAD.Interop и ...Common) - в Вашей постановке задачи скорее всего она будет предпочтительней..
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > С# + AutoCAD для "носорогов".



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Интеграция Autodesk СПДС в AutoCAD 2012 bolotov Прочее. Программное обеспечение 24 07.01.2013 20:22
Превратить AutoCAD Map 3D в обычный AutoCAD (по панелям) gizmo_zx Вертикальные решения на базе AutoCAD 3 24.08.2011 11:25
AutoCAD 2009/2010 в ряде вопросов серьёзно курят перед AutoCAD 2007/2008 hwd Баги и пожелания в Autodesk 30 10.11.2010 12:56
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27