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

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

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

Ответ
Поиск в этой теме
Непрочитано 08.05.2014, 16:33
С# + 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.

Кому то это просто, а у меня что то не ухватывается способ достичь результата.
Просмотров: 11494
 
Непрочитано 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