| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET Программный аналог "Извлечения данных..."

.NET Программный аналог "Извлечения данных..."

Ответ
Поиск в этой теме
Непрочитано 05.12.2013, 15:02 #1
.NET Программный аналог "Извлечения данных..."
La Persona
 
Чайник
 
Регистрация: 01.12.2011
Сообщений: 27

Уважаемые знатоки .NET!
Подскажите пожалуйста, как организовать извлечение данных на .NET, не прибегая к меню "Извлечение данных"? Может есть какая-то функция отдельная?
Параметры извлечения будут всегда одинаковыми и меняться не будут.
На форуме обсуждались варианты на LISPе, но желательно на NET.
Просмотров: 3800
 
Непрочитано 05.12.2013, 16:40
#2
Do$

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


Извлечение каких данных? Программно можно извлечь любой объект чертежа и прочитать любые его свойства. После этого, эти свойства можно обработать как угодно и вывести результат куда угодно. Вот такой вот "аналог"
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 05.12.2013, 17:26
#3
trir


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


http://docs.autodesk.com/ACD/2010/EN...r%27s%20Guide/
trir вне форума  
 
Непрочитано 09.12.2013, 01:28
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от La Persona Посмотреть сообщение
Уважаемые знатоки .NET!
Подскажите пожалуйста, как организовать извлечение данных на .NET, не прибегая к меню "Извлечение данных"? Может есть какая-то функция отдельная?
Параметры извлечения будут всегда одинаковыми и меняться не будут.
На форуме обсуждались варианты на LISPе, но желательно на NET.
Посмотри может выберешь чего из этого примера, заодно глянь ссылки:

http://forums.autodesk.com/t5/NET/Au...3604728#M30943
http://through-the-interface.typepad...ting-data.html

Код:
[Выделить все]
        #region "System"
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Data;
using System.Timers;
using System.Windows.Forms;
#endregion

#region "AutoCAD Imports"

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DataExtraction;
#endregion
//--------------------------------------------------//

       //' based on Kean Walmsley's example from there:
        //' http://through-the-interface.typepad.com/through_the_interface/2008/04/extracting-data.html
        [CommandMethod("extdata")]
        public void ExtractData()
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            double starttime = 0;
            double endtime = 0;

            System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();

            dialog.CheckPathExists = true;
            dialog.CheckPathExists = true;
            dialog.DefaultExt = "dwg";
            dialog.DereferenceLinks = true;
            dialog.Multiselect = false;
            dialog.Filter = "Drawing (*.dwg)|*.dwg|All files (*.*)|*.*";
            dialog.Title = "Select drawing";
           dialog.FilterIndex = 1;


            if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return;
            }

            string fname = dialog.FileName;
            System.Timers.Timer _timer = new System.Timers.Timer();
          _timer.Interval = 1000;
          _timer.Start();
          starttime = DateTime.Now.TimeOfDay.TotalMilliseconds;


            try
            {
                //------------------------------------------------------------------------------------------------------
                // following datatable easy to write to the any data file (Excel, Access etc)

                System.Data.DataTable dataTable = extractLinesAndTexts(fname);

                 _timer.Stop();
                //------------------------------------------------------------------------------------------------------
                     endtime = DateTime.Now.TimeOfDay.TotalMilliseconds;
                //' write data to Lines.xml in the Debug folder
                dataTable.WriteXml("LinesAndTexts.xml");

                ed.WriteMessage("\nElapsed time: {0:f2} milliseconds" + "\n" + "Found {1} objects\n" , endtime - starttime, dataTable.Rows.Count);

            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString() + "\n" + ex.StackTrace);
            }
            //' Display the  file
            Process.Start("LinesAndTexts.xml", null);
        }

        public System.Data.DataTable extractLinesAndTexts(string fname)
        {
           
            System.Data.DataTable dataTable = new System.Data.DataTable();
            System.Data.DataTable blkTable = new System.Data.DataTable();
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            List<string> tags = new List<string>();
            if (!System.IO.File.Exists(fname))
            {
                ed.WriteMessage("\nDrawing file does not exist.\n");
                return null;      
            }
            IDxExtractionSettings es = new DxExtractionSettings();

            IDxDrawingDataExtractor de = es.DrawingDataExtractor;

            de.Settings.ExtractFlags = ExtractFlags.None | ExtractFlags.ModelSpaceOnly;

            de.Settings.ExtractFlags = ExtractFlags.ExtractBlockOnly;
            //'Or ExtractFlags.ModelSpaceOnly

            IDxFileReference fr = new DxFileReference(Path.GetDirectoryName(fname), fname);

            de.Settings.DrawingList.AddFile(fr);

            // Scan the drawing for object types & their properties

            de.DiscoverTypesAndProperties(Path.GetDirectoryName(fname));

            List<IDxTypeDescriptor> types = de.DiscoveredTypesAndProperties;

            // Select all the types and properties for extraction

            // by adding them one-by-one to these two lists

            List<string> selTypes = new List<string>();

            List<string> selProps = new List<string>();


            foreach (IDxTypeDescriptor type in types)
            {

                selTypes.Add(type.GlobalName);


                foreach (IDxPropertyDescriptor pr in type.Properties)
                {


                    if (!selProps.Contains(pr.GlobalName))
                    {

                        selProps.Add(pr.GlobalName);
                    }

                }
            }

            de.Settings.SetSelectedTypesAndProperties(types, selTypes, selProps);

            // Now perform the extraction itself

            de.ExtractData(Path.GetDirectoryName(fname));

            // Get the results of the extraction

            dataTable = de.ExtractedData;


            if (dataTable.Rows.Count > 0)
            {
                dataTable.TableName = "LinesAndTexts";

                DataRow[] selrows = dataTable.Select("AcDxObjectTypeGlobalName Like '%Line' Or AcDxObjectTypeGlobalName Like '%Text' Or AcDxObjectTypeGlobalName Like '%MText'");

                blkTable = dataTable.Clone();

                foreach (DataRow dr in selrows)
                {
                    blkTable.ImportRow(dr);
                }
                //' commented code lines is just for populating a form listBox control:
                //Dim columns As String() = New String() {"AcDxObjectTypeName"}

                //Dim dvw As DataView = blkTable.DefaultView
                //distinctTable = dvw.ToTable(False, columns)

                //Dim bnames As New List(Of String)()
                //For Each dr As System.Data.DataRow In distinctTable.Rows
                //    Dim bname As String = dr(0).ToString()
                //    If Not bnames.Contains(bname) Then
                //        bnames.Add(bname)
                //    End If
                //Next

                //Me.lst.DataSource = bnames'' <-- to fill ListBox only

                //lst.SelectedIndex = -1'' <-- set selected items to nothing
            }

            return blkTable;

        }
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET Программный аналог "Извлечения данных..."

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Аналог IDispatch в .NET Nordek .NET 5 22.12.2011 18:07
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок. Pastor LISP 16 17.11.2010 13:15
Существует ли аналог (findfile) в .NET? Кулик Алексей aka kpblc .NET 16 13.08.2010 00:11