C#. Как совместить работу формы с Autocad?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C#. Как совместить работу формы с Autocad?

C#. Как совместить работу формы с Autocad?

Ответ
Поиск в этой теме
Непрочитано 29.10.2014, 13:32 #1
C#. Как совместить работу формы с Autocad?
Дианка
 
Регистрация: 14.10.2014
Сообщений: 29

Доброе время суток. У меня возник такой чайниковский вопрос,пару дней копаюсь в C#(Micr.Visual Studio) и почиркала пару плагинов,и пару формочек,а как это объединить и возможно ли,я не понимаю. Начало темы

Объясняю суть задачи:

Нажать кнопочку в Autocad->Выскочило диалоговое окно выбора проекта->получила Selected Folder path в строковую переменную,которая в свою очередь будет служить ключём поиска нужной строки данных в table на SQL (тут кстати тоже есть проблема,но наверное как то решается заменой символов)->выбралась строка -> отсюда идёт запрос есть ли у него подъобъекты (которые хочу вынести в combobox).Вот из этого всего берутся необходимые значения String и обновляют значения атрибута блока,который попутно вставится в Autocade %) .

Если да-возможно,то сначала хотела бы решить мелкую проблему, необходимую для поиска.У меня строка Selected Folder path преобразуется из одного "\"в "\\" -как это необходимо для SQL запроса,ну и соответственно не может найти в БД соответствующую строку,как это решить?метод replace тоже ругается на синтаксис
Код:
[Выделить все]
using System;
using System.IO;
using System.Windows.Forms;
using System.Data.SqlClient; 
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace FoldBrDlg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
         private void button1_Click(object sender, EventArgs e)
        {            
               DialogResult result = folderBrowserDialog1.ShowDialog();
                if (result == DialogResult.OK)
                {
                    string PrjPath = folderBrowserDialog1.SelectedPath;
                    MessageBox.Show(PrjPath);
                    SqlConnection connection = new SqlConnection("Data Source=SAPR;Initial Catalog=**;Integrated Security=SSPI");

                    SqlCommand command = new SqlCommand("select PrjName from Test_data WHERE Path=" + PrjPath, connection);
                            connection.Open();
                                using (var reader = command.ExecuteReader())
                                    {
                                        while (reader.Read())
                                            textBox1.Text = reader["PrjName"].ToString();
                                    }
                            connection.Close();
                }
        }

         private void button2_Click(object sender, EventArgs e)
         {
             this.Close();
         }
    }
}

p.s.
Autocad 2013 SP1
.NET Framework 4.5.
Microsoft Visual Studio Ultimate 2013
Version 12.0.30723.00 Update 3

p.p.s.
добавила
Код:
[Выделить все]
namespace MyAut
{
    public class test
    {
       //public static string Itog;

        [CommandMethod("CreateMText")]
        public static void CreateMText()
        {
            Document acDoc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            // Start a transaction
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                // Open the Block table for read
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                             OpenMode.ForRead) as BlockTable;

                // Open the Block table record Model space for write
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                                OpenMode.ForWrite) as BlockTableRecord;

                // Create a multiline text object
                MText acMText = new MText();
                acMText.Location = new Point3d(2, 2, 0);
                acMText.Width = 4;
                //acMText.Contents = "This is a text string for the MText object.";
                acMText.Contents = Itog; // это текст из Textbox1.text
                acBlkTblRec.AppendEntity(acMText);
                acTrans.AddNewlyCreatedDBObject(acMText, true);

                // Save the changes and dispose of the transaction
                acTrans.Commit();
            }
        }
    }
}
я вообще на правильном пути?

Миниатюры
Нажмите на изображение для увеличения
Название: sql.jpg
Просмотров: 128
Размер:	305.1 Кб
ID:	137821  Нажмите на изображение для увеличения
Название: sql-serv.jpg
Просмотров: 98
Размер:	98.4 Кб
ID:	137822  


Последний раз редактировалось Дианка, 30.10.2014 в 09:47.
Просмотров: 10412
 
Непрочитано 29.10.2014, 14:13
#2
Do$

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


Autocad 2013 требует приложений под .NET Framework версии 4.0
Для запуска форм в AutoCAD NET API есть методы в классе Application: ShowDialog, ShowWindow и т.п.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2014, 14:39
#3
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от Do$ Посмотреть сообщение
Autocad 2013 требует приложений под .NET Framework версии 4.0
Для запуска форм в AutoCAD NET API есть методы в классе Application: ShowDialog, ShowWindow и т.п.
а дальше? SQL запросы к серверу, можно реализовать?
Дианка вне форума  
 
Непрочитано 29.10.2014, 14:41
#4
Кулик Алексей aka kpblc
Moderator

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


Дианка, уже было сказано: картинки присоединяй к посту. Последовательность описана в справке по форуму.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2014, 15:31
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Всё можно, только желательно разнести по классам
trir вне форума  
 
Непрочитано 29.10.2014, 16:29
#6
Do$

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


Цитата:
Сообщение от Дианка Посмотреть сообщение
а дальше? SQL запросы к серверу, можно реализовать?
Это уже лучше на форумах SQLщиков узнавать.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 30.10.2014, 00:17
#7
Дима_

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


Я лично ни разу не понял в чем вопрос, функция ругается на синтаксис - ну так хоть покажите как Вы ее вызываете. Объяснили Вы суть задачи, даже написали что-то, в чем вопрос-то?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.10.2014, 08:52
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Можно так
Код:
[Выделить все]
<CommandMethod("OpenDXML")> _
    Public Sub OpenDXML()
        Dim OpenFileDialog1 As New System.Windows.Forms.OpenFileDialog
        If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            <твой код>
        End If
    End Sub
И так
Код:
[Выделить все]
Public Sub CrMyPalette()
    	    Dim myPaletteSet As Autodesk.AutoCAD.Windows.PaletteSet
    	    Dim myPalette As UserControl1
            myPaletteSet = New Autodesk.AutoCAD.Windows.PaletteSet("My Palette")
            myPalette = New UserControl1
            myPaletteSet.Add("Palette1", myPalette)
End Sub
trir вне форума  
 
Автор темы   Непрочитано 30.10.2014, 09:51
#9
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от trir Посмотреть сообщение
Можно так
Код:
[Выделить все]
<CommandMethod("OpenDXML")> _
    Public Sub OpenDXML()
        Dim OpenFileDialog1 As New System.Windows.Forms.OpenFileDialog
        If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            <твой код>
        End If
    End Sub
И так
Код:
[Выделить все]
Public Sub CrMyPalette()
    	    Dim myPaletteSet As Autodesk.AutoCAD.Windows.PaletteSet
    	    Dim myPalette As UserControl1
            myPaletteSet = New Autodesk.AutoCAD.Windows.PaletteSet("My Palette")
            myPalette = New UserControl1
            myPaletteSet.Add("Palette1", myPalette)
End Sub
от VBA отказ у нас....
а в С# нет проблем с диалогом,я хотела узнать как связать плагин для автокада %) и формочку winformapp.exe
точнее данные полученные из формы, в автокаде использовать

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я лично ни разу не понял в чем вопрос, функция ругается на синтаксис - ну так хоть покажите как Вы ее вызываете. Объяснили Вы суть задачи, даже написали что-то, в чем вопрос-то?
вкратце так:сделала формочку в C# ,по клику на кнопку, идёт запрос на folderBrowserDialog1 -> сохраняется путь фолдера ,string PrjPath = folderBrowserDialog1.SelectedPath ="Z:\Projects\blblbalba..\ "

эту переменную строковую,я использую как ключевую в SELECT из SQL-базы. типо "SELECT * FROM table WHERE Path=PrjPath", но когда идет перемещение этой переменной в sql запрос,то там строка меняется "Z:\Projects\blblbalba..\ "->"Z:\\Projects\\blblbalba..\\ " соответственно,не происходит выборка.

на первый вопрос по связке формы и плагинов я вечером нашла тут древненький топик, сейчас буду читать 6 стр.

Последний раз редактировалось Дианка, 30.10.2014 в 10:03.
Дианка вне форума  
 
Непрочитано 30.10.2014, 10:46
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Это VB.NET
Вместо System.Windows.Forms.OpenFileDialog - ставишь свою форму и через поля или методы получаешь нужные данные
Или делаешь палитру и то же самое...
А можно из формы управлять АкАд'ом
trir вне форума  
 
Автор темы   Непрочитано 30.10.2014, 15:44
#11
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от trir Посмотреть сообщение
Это VB.NET
Вместо System.Windows.Forms.OpenFileDialog - ставишь свою форму и через поля или методы получаешь нужные данные
Или делаешь палитру и то же самое...
А можно из формы управлять АкАд'ом

а,допёрло!!!т.е. всё то что я писала в applic нужно писать под [CommandMethod(..)]
до меня всё не дойдет,что если добавить нужные dll, и прописать using можно использовать и тот и тот функционал.
Спасибо! посижу потестирую..

а дальше как лучше? полученный "стринг-ключ" можно как то "зашить" в БД чертежа?(я где то мельком видела что там,хранится что-то)
и потом при создании кнопки "обновление данных", чтоб программка доставала этот ключик из данных БД и "по новой".
Offtop: .впрочем это уже лирика-размышлялки вслух.
Дианка вне форума  
 
Непрочитано 31.10.2014, 07:34
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Всё зависит от "уровня" данных -
если "файл" - свойства файла
примитив - xdata, xrecord
и т. д.
trir вне форума  
 
Непрочитано 02.11.2014, 00:09
#13
Дима_

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


Цитата:
Сообщение от Дианка Посмотреть сообщение
но когда идет перемещение этой переменной в sql запрос,то там строка меняется "Z:\Projects\blblbalba..\ "->"Z:\\Projects\\blblbalba..\\ "
Строку Вам там точно никто не меняет - отображаться может по разному.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 06.11.2014, 11:32
#14
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Строку Вам там точно никто не меняет - отображаться может по разному.
Да,Вы правы,так и оказалось....немножко процедуру надо было переделать.
ДО
Код:
[Выделить все]
SqlCommand command = new SqlCommand("select PrjName from Test_data WHERE Path=" + PrjPath, connection);
ПОСЛЕ.Разделила команду.
Код:
[Выделить все]
string sql="select PrjName from Test_data WHERE Path='" + PrjPath+"'";
SqlCommand command = new SqlCommand(sql, connection);
-что то типо того.
Дианка вне форума  
 
Автор темы   Непрочитано 06.11.2014, 11:41
#15
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


у меня теперь другая "проблемка", никак не могу нормально блок вставить из другого файла -по этой методике,но добавляется только запись блока в бд чертежа,
дальше дописала процедуру вставки непосредственно в чертеж,но пропадают поля блока(в блоке лукапами-полями созданы списки фамилий)


причем смотрю свойства блок действительно является блоком...

Код:
[Выделить все]
namespace ClassLibrary6
{
    public class Commands
    {
        [CommandMethod("IB")]
        public void AddBlocktoDataBase()
        {
            string blkname = "KIP";
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            using (Database OpenDb = new Database(false, true))
            {                
                    OpenDb.ReadDwgFile("C:\\Incoming\\WORK\\SHTAMPS\\ALL_Fam.dwg", System.IO.FileShare.ReadWrite, true, "");
                ObjectIdCollection ids = new ObjectIdCollection();

                using (Transaction tr = OpenDb.TransactionManager.StartTransaction())
                {
                    //For example, Get the block by name "BlkName"
                    BlockTable bt;
                    bt = (BlockTable)tr.GetObject(OpenDb.BlockTableId, OpenMode.ForRead);

                    if (bt.Has(blkname))
                    {
                        ids.Add(bt[blkname]);
                    }
                    tr.Commit();
                }
                //if found, add the block
                if (ids.Count != 0)
                {    //get the current drawing database
                    Database destdb = doc.Database;
                    IdMapping iMap = new IdMapping();
                    destdb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
                   
                    using(Transaction myT =destdb.TransactionManager.StartTransaction())
                    {
                        BlockTable bt = destdb.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

                        BlockTableRecord btr =bt[blkname].GetObject(OpenMode.ForRead) as BlockTableRecord;
                        BlockTableRecord ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord; // Выбор пространства вставки блока 

                        PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки: ");
                        Point3d pt = ppr.Value;
                        BlockReference blockref = new BlockReference(pt, btr.ObjectId);
                        ms.AppendEntity(blockref);
                        myT.AddNewlyCreatedDBObject(blockref,true);
                        myT.Commit();
                    }
                }
            }
        }
    }
}
----- добавлено через ~15 мин. -----
балда короче,надо было синхронизировать атрибуты.
пропишу функцию синхронизации....

п.с.
что-то не всё так просто
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 75
Размер:	73.1 Кб
ID:	138182  

Последний раз редактировалось Дианка, 06.11.2014 в 12:16.
Дианка вне форума  
 
Непрочитано 06.11.2014, 12:17
#16
Boxa

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


Цитата:
Сообщение от Дианка Посмотреть сообщение
Если так написать сильно ужасно будет?
string msg = string.Format("(command \"{0}\" \"{1}\" \"{2}\")", "_.ATTSYNC", "_NAME", blkname);
Тут посмотрите https://sites.google.com/site/bushma...metki/attsynch
Boxa вне форума  
 
Непрочитано 06.11.2014, 13:25
#17
Do$

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


Цитата:
Сообщение от Дианка Посмотреть сообщение
п.с.
что-то не всё так просто
Да ну, есть же примеры: http://adndevblog.typepad.com/autoca...odelspace.html
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 06.11.2014, 15:02
#18
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от Boxa Посмотреть сообщение
это то да,но кодище-застрелиться,во-вторых пару обращений не понимает,в частности "Cast"я уже не знаю в какой dll такое искать

----- добавлено через 57 сек. -----
Цитата:
Сообщение от Do$ Посмотреть сообщение
Да ну, есть же примеры: http://adndevblog.typepad.com/autoca...odelspace.html
да он там новые атрибуты определяет ),а так чтоб синхронизировать...
а может вообще не нужна синхронизация,а просто при вставке блока мне что-то надо дописать,я не понимаю.

----- добавлено через ~2 мин. -----
а вот такое вписать-совсем моветон?
он у меня синхронизирует,ну и в конце добавляет какой то nil

Код:
[Выделить все]
           string msg = string.Format("(command \"{0}\" \"{1}\"  \"{2}\")", "_.ATTSYNC", "_NAME", blkname);
                        doc.SendStringToExecute(msg+" " , true, false, false);
Дианка вне форума  
 
Непрочитано 06.11.2014, 15:46
#19
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Цитата:
в частности "Cast"я уже не знаю в какой dll такое искать
Это же Linq - как же без него?
using System.Linq;
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
trir вне форума  
 
Автор темы   Непрочитано 06.11.2014, 23:08
#20
Дианка


 
Регистрация: 14.10.2014
Сообщений: 29


Цитата:
Сообщение от trir Посмотреть сообщение
Это же Linq - как же без него?
using System.Linq;
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
о!Спасибо!
странно,мне казалось он у меня подключен ))) и всё равно ругался код.
надо будет в шпаргалку записать какой к чему, за неделю еще не запомнила.
------------------------------------------------------------------------------------------
этот гемор с синхронизацией я затеяла(впрочем если дин.блок вставится без него нормально,было бы замечательно),потому что подглядела вставку блока из внешнего файла по имени блока, решила, что лучше будет хранить все блоки необходимые в одном файле,а не как ранее задумывалось ,в необходимых таблицах SQL-serv, каждому блоку-свой путь(файл)
Дианка вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C#. Как совместить работу формы с Autocad?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самопроизвольно прекращает работу AutoCAD 2013 nukl3r AutoCAD 3 26.01.2013 11:51
Extended AutoCAD .Net API hwd .NET 5 22.08.2012 19:38
Свежие книги по AutoCAD. Какая лучше? Marsikus Поиск литературы, чертежей, моделей и прочих материалов 10 28.01.2012 16:55
Где в реестре хранится информация о том, что в системе когда-то был установлен AutoCAD? Archeo AutoCAD 12 14.10.2009 15:24
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48