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

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

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

Ответ
Поиск в этой теме
Непрочитано 29.10.2014, 13:32
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.
Просмотров: 10461
 
Автор темы   Непрочитано 11.11.2014, 13:13
#21
Дианка


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


Добрый день!
Подскажите пожалуйста,как при вставке блока с аттрибутами,задать значения из формы.
ну точнее несколько атрибутов одного блока . Я нашла пример "обновления зн.атрибутов",но там по одному атрибуту,в итоге у меня как то получается тупость : на каждый таг отдельный войд.

Код:
[Выделить все]
  
         public void UpdPrjName()
        {*****
            UpdateAttributesInDatabase( db,blockName,attbName,attbValue );
        } 
      public void UpdShifr()
      public void UpdStage()
      public void UpdNameObject()
       
      private void UpdateAttributesInDatabase()   
      private int UpdateAttributesInBlock()
еще попробовала ТАКОЙ вариант,но не сработало.
а хотелось бы ИМЕННО такой вариант осуществить,т.е. в столбик перечислить таги,и значения.
Код:
[Выделить все]
ApplyAttibutes(db, tr, bref, new List<string>(new string[] {
					"TAG1",
					"TAG2",
					"TAG3",
					"TAG4"
				}), new List<string>(new string[] {
					"Value #1",
					"Value #2",
					"Value #3",
					"Value #4"
				}));
может проблема в том,что я вставляю блок из внешнего DWG..

Код:
[Выделить все]
public Point3d Ins_Shtamp_Block()
        {   
            /// Получили путь к штампу;                                             ///
   ***********************************
            ///Вставка блока:                                                       ///
            ///---------------------------------------------------------------------///
            Document doc = acadApp.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Transaction tr = doc.TransactionManager.StartTransaction();
            using (tr)
            {
                string dwgname = HostApplicationServices.Current.FindFile(Shtamp_Path,
                acadApp.DocumentManager.MdiActiveDocument.Database, FindFileHint.Default);
                Database db = new Database(false, false);
                Database curdb = doc.Database;
                db.ReadDwgFile(dwgname, System.IO.FileShare.Read, true, null);
                ObjectId BlkId = doc.Database.Insert(dwgname, db, false);
                BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead, true);
       
                BlockTableRecord ps = tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока ");
                Point3d pt = ppr.Value;
                BlockReference bref = new BlockReference(pt, BlkId);

ТУТ не срабатывает

                //ApplyAttibutes(curdb, tr, bref, new List<string>(new string[] {
                //    "MARKA",
                //    "STAGE",
                //}), new List<string>(new string[] {
                //    "Tekst 1",
                //    "Tekst 2",}));
                //ps.AppendEntity(bref);
                //tr.AddNewlyCreatedDBObject(bref, true);
                //bref.RecordGraphicsModified(true);
                ////// to force updating a block reference
                ////tr.TransactionManager.QueueForGraphicsFlush();


                bref.ExplodeToOwnerSpace();
                bref.Erase();
                tr.Commit();
----- добавлено через ~7 мин. -----
или вот возникла идея присваивать значения attbName,attbValue из цикла...сделать список list string[], задать цикл разбиения по лист.итем ?ну и в самом цикле присвоил значения атрибута и значения и отправить на апд.

----- добавлено через ~25 мин. -----
а вот и поспешила...........
Код:
[Выделить все]
            string blockName = "SHTAMP";

            List<string> AllTags = new List<string>();
                AllTags.Add("PRJNAME");
                AllTags.Add("SHIFR");
                AllTags.Add("OBJECT");
                AllTags.Add("MARKA");
                AllTags.Add("STAGE");
                AllTags.Add("NUMOBJ");

           List<string> AllValues = new List<string>();
            AllValues.Add(txt_PrjName.Text.Trim());
            AllValues.Add(txt_Shifr.Text.Trim());
            AllValues.Add("BLA");

  !!!!!!!!!!!         foreach (string s in AllTags , AllValues )
            {
            ///.................
            /// string attbName = ;
            /// string attbValue = ;
            ///
                UpdateAttributesInDatabase();
            }
Дианка вне форума  
 
Непрочитано 11.11.2014, 13:40
#22
trir


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


Так как блок хранит атрибуты как колекцию ObjectId, нельзя обращатся к атрибуту по имени. Но вашу таблицу можно записать в словарь с ключом по тэгу и используя цикл foreach (ObjectId arId in br.AttributeCollection) - обновить атрибуты блока за один проход
trir вне форума  
 
Автор темы   Непрочитано 11.11.2014, 17:34
#23
Дианка


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


Цитата:
Сообщение от trir Посмотреть сообщение
Так как блок хранит атрибуты как колекцию ObjectId, нельзя обращатся к атрибуту по имени. Но вашу таблицу можно записать в словарь с ключом по тэгу и используя цикл foreach (ObjectId arId in br.AttributeCollection) - обновить атрибуты блока за один проход
Вот что то типо того? Или можно еще красивее?
умнее было бы вынести всю эту процедуру в отдельное да?
а я ведь
Код:
[Выделить все]
                    foreach (ObjectId obId in ps) ///ps -tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                             {
                                DBObject dbObj = tr.GetObject(obId, OpenMode.ForRead);
                                BlockReference blkRef = dbObj as BlockReference;
                                if (blkRef != null)
                                {
                                    BlockTableRecord blkDef = (BlockTableRecord)tr.GetObject(blkRef.BlockTableRecord, OpenMode.ForRead);
                                    ed.WriteMessage("\nBlock named: " + blkDef.Name);
                             if (blkDef.Name.ToUpper()=="SHTAMP") ///мой блок
                                    foreach (ObjectId idAtt in blkRef.AttributeCollection)
                                    {
                                        Entity ent = (Entity)tr.GetObject(idAtt, OpenMode.ForWrite);
                                        if (ent is AttributeReference)
                                        {
                                            AttributeReference attRef = (AttributeReference)ent;
                                           if (attRef.Tag.ToUpper() == "PRJNAME")
                                            {
                                                attRef.TextString = txt_PrjName.Text.Trim();
                                            }

                                           if (attRef.Tag.ToUpper() == "SHIFR")
                                           {
                                               attRef.TextString = txt_Shifr.Text.Trim();
                                           }
                                        }
                                    }
                                }
                            }
Дианка вне форума  
Ответ
Вернуться   Форум 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