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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Экспорт нумерации блоков в таблицу

Экспорт нумерации блоков в таблицу

Ответ
Поиск в этой теме
Непрочитано 08.08.2018, 15:09 #1
Экспорт нумерации блоков в таблицу
Dmitry_maccaferri
 
Инженерная защита территорий
 
Москва
Регистрация: 02.04.2010
Сообщений: 3

Добрый день!

Прошу помочь решить задачку. Есть дендроплан на котором отображено чуть более 12000 деревьев в виде блоков. Всего четыре вида деревьев и соответственно четыре вида блоков. В точке вставки каждого блока имеется текст с нумерацией деревьев, содержащий букву и цифру. Нумерация не является атрибутом блока. Вопрос: как можно экспортировать информацию из dwg в таблицу, в каждой строке которой будет содержаться следующая информация: номер дерева, имя блока, координаты точки.

Фрагмент из подеревки прилагаю.

Буду признателен за помощь. Спасибо!

Вложения
Тип файла: dwg
DWG 2013
Подеревка.dwg (1.18 Мб, 26 просмотров)

Просмотров: 2360
 
Непрочитано 08.08.2018, 20:59
#2
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Точки не совпадают на 4 ноле, несколько текстов у одного блока.
Если таких файлов много и лиспом никто не поделится, договоримся...
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 09.08.2018, 07:36
1 | #3
Boxa

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


и в чем проблема, зачем тут лисп и программирование?
DATAEXTRACTION.
Экспортируйте по отдельности координаты блока и текста в xls файл и просто соберите данные вместе

Выглядеть это будет как то вот так:


Boxa вне форума  
 
Непрочитано 09.08.2018, 07:58
#4
trir


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


Используй FDO
trir вне форума  
 
Непрочитано 09.08.2018, 09:02
#5
alex101000


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


trir, пора FDO ссылкой делать
alex101000 вне форума  
 
Непрочитано 09.08.2018, 09:55
1 | #6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


на .Net это тоже за несколько минут пишется)

Код:
[Выделить все]
// Microsoft
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;


namespace TreeAnalyse
{
    public class CommandClass
    {
        /// <summary>
        /// Имена блоков
        /// </summary>
        private static string[] NameBlocks={
                                            "Гари сухостои",
                                            "Дерево Ель и Пихта", 
                                            "Дерево Мелколиственное", 
                                            "Дерево Сосна и Кедр"
                                           };

        /// <summary>
        /// Имя слоя с точками и текстами
        /// </summary>
        private const string NameNumLayer = "Подеревка_Номера деревьев";

        /// <summary>
        /// Зазор проверки дистанции
        /// </summary>
        private const double LimDist = 0.001;


        /// <summary>
        /// Элемент списка
        /// </summary>
        private struct ItemLD
        {
            /// <summary>
            /// Координаты точки
            /// </summary>
            public Point3d Point;
            /// <summary>
            /// Имя блока
            /// </summary>
            public string NameBlock;
            /// <summary>
            /// Номер дерева
            /// </summary>
            public string Number;
            /// <summary>
            /// Флаг валидности структуры
            /// </summary>
            public int FlagValid;

            /// <summary>
            /// Базовый конструктор структуры
            /// </summary>
            /// <param name="aPoint">Точка</param>
            public ItemLD(DBPoint aPoint)
            {
                Point = aPoint.Position;
                NameBlock = null;
                Number = null;
                FlagValid = 1;
            }
        }


        [CommandMethod("TRA", CommandFlags.Modal | CommandFlags.NoPaperSpace)]
        static public void TRA()
        {
            // Получаем активный документ, его редактор и БД чертежа
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Editor lAcadEd = lAcadDoc.Editor;
            Database lAcadDb = lAcadDoc.Database;
            // Получаем все точки на указанном слое
            TypedValue[] lFilterlist = new TypedValue[2];
            lFilterlist[0] = new TypedValue(0, "POINT");
            lFilterlist[1] = new TypedValue(8, NameNumLayer);
            PromptSelectionResult lSelRes = lAcadEd.SelectAll(new SelectionFilter(lFilterlist));
            // Если неудачно - выходим
            if (lSelRes.Status != PromptStatus.OK)
            {
                lAcadEd.WriteMessage("\nОшибка: Не найдены точки на слое {0}\n", NameNumLayer);
                return;
            }
            // Запоминаем идентификаторы точек
            ObjectId[] lListIdPoints = lSelRes.Value.GetObjectIds();
            // Получаем все тексты на указанном слое
            lFilterlist[0] = new TypedValue(0, "TEXT");
            lSelRes = lAcadEd.SelectAll(new SelectionFilter(lFilterlist));
            // Если неудачно - выходим
            if (lSelRes.Status != PromptStatus.OK)
            {
                lAcadEd.WriteMessage("\nОшибка: Не найдены тексты номеров на слое {0}\n", NameNumLayer);
                return;
            }
            // Запоминаем идентификаторы текстов
            ObjectId[] lListIdTexts = lSelRes.Value.GetObjectIds();
            // Получаем все вставки блоков
            lFilterlist = new TypedValue[1];
            lFilterlist[0] = new TypedValue(0, "INSERT");
            lSelRes = lAcadEd.SelectAll(new SelectionFilter(lFilterlist));
            // Если неудачно - выходим
            if (lSelRes.Status != PromptStatus.OK)
            {
                lAcadEd.WriteMessage("\nОшибка: Не найдены блоки в чертеже {0}\n");
                return;
            }
            // Запоминаем идентификаторы блоков
            ObjectId[] lListIdBlocks = lSelRes.Value.GetObjectIds();
            // Создаем список элементов
            List<ItemLD> lListILD = new List<ItemLD>(lListIdPoints.Count());
            // Счетчики неприкаянных элементов
            int lCountInvalidPoint = 0;
            int lCountInvalidBlock = 0;
            int lCountInvalidNumber = 0;
            // Собираем информацию из точек
            using (Transaction lAcadTran = lAcadDb.TransactionManager.StartTransaction())
            {
                foreach (ObjectId lId in lListIdPoints)
                {
                    lListILD.Add(new ItemLD(lAcadTran.GetObject(lId, OpenMode.ForRead) as DBPoint));
                }
                lAcadTran.Commit();
            }
            // Проходим по номерам
            using (Transaction lAcadTran = lAcadDb.TransactionManager.StartTransaction())
            {
                foreach (ObjectId lId in lListIdTexts)
                {
                    bool lNFFlag = true;
                    DBText lText = lAcadTran.GetObject(lId, OpenMode.ForRead) as DBText;
                    Point3d lPosText = lText.Position;
                    for (int i = 0; i < lListILD.Count; i++)
                    {
                        if(lPosText.DistanceTo(lListILD[i].Point) < LimDist)
                        {
                            ItemLD lItem = lListILD[i];
                            lItem.Number = lText.TextString;
                            lItem.FlagValid++; 
                            lListILD[i] = lItem;
                            lNFFlag = false;
                            break;
                        }
                    }
                    if (lNFFlag) lCountInvalidNumber++;
                }
                lAcadTran.Commit();
            }
            // Проходим по блокам
            Array.Sort(NameBlocks);
            using (Transaction lAcadTran = lAcadDb.TransactionManager.StartTransaction())
            {
                foreach (ObjectId lId in lListIdBlocks)
                {
                    BlockReference lBRef = lAcadTran.GetObject(lId, OpenMode.ForRead) as BlockReference;
                    Point3d lPosBRef = lBRef.Position;
                    bool lNFFlag = true;
                    for (int i = 0; i < lListILD.Count; i++)
                    {
                        if (lPosBRef.DistanceTo(lListILD[i].Point) < LimDist)
                        {
                            // Получаем имя блока
                            BlockTableRecord lBTR = null;
                            lBTR = (BlockTableRecord)(lBRef.IsDynamicBlock ? 
                                lAcadTran.GetObject(lBRef.DynamicBlockTableRecord, OpenMode.ForRead) : 
                                    lAcadTran.GetObject(lBRef.BlockTableRecord, OpenMode.ForRead));
                            string lNameBlock = lBTR.Name;
                            // Если имя блока присуствует в списке обрабатываемых
                            if(Array.BinarySearch(NameBlocks, lNameBlock) >= 0)
                            {
                                ItemLD lItem = lListILD[i];
                                lItem.NameBlock = lNameBlock;
                                lItem.FlagValid++;
                                lListILD[i] = lItem;
                                lNFFlag = false;
                                break;    
                            }
                        }
                    }
                    if(lNFFlag)lCountInvalidBlock++;
                }
                lAcadTran.Commit();
            }
            // Выводим в *.txt файл
            string lNameOutFile = Path.ChangeExtension(lAcadDb.Filename, ".txt");
            try
            {
                using (StreamWriter lW = new StreamWriter(lNameOutFile, false ,System.Text.Encoding.Unicode))
                {
                    lW.WriteLine("№дер;Название блока;X;Y;Z");
                    foreach (ItemLD lItem in lListILD)
                    {
                        if (lItem.FlagValid > 2)
                        {
                            lW.WriteLine("{0};{1};{2};{3};{4}", lItem.Number, lItem.NameBlock,
                                                        lItem.Point.X.ToString(".000"),
                                                        lItem.Point.Y.ToString(".000"),
                                                        lItem.Point.Z.ToString(".000"));
                        }
                        else
                        {
                            if((lItem.FlagValid == 1) && (lItem.Number == null)
                                &&(lItem.NameBlock == null)) lCountInvalidPoint++;
                        }
                    }
                    lW.Flush();
                }
            }
            catch (System.Exception ex)
            {
                lAcadEd.WriteMessage("\nВ процессе записи файла произошла ошибка {0}\n", ex.Message);
            }
            // Вывод статистики
            lAcadEd.WriteMessage("\n===== Работа завершена ====");
            lAcadEd.WriteMessage("\nВсего найдено точек {0} на слое {1}", lListILD.Count, NameNumLayer);
            lAcadEd.WriteMessage("\nОшибочных: точек {0}; текстов номеров {1}; блоков {2}\n", 
                lCountInvalidPoint, lCountInvalidNumber, lCountInvalidBlock);
        }
    
    }
}

Статистика:
Цитата:
Команда: TRA
===== Работа завершена ====
Всего найдено точек 3832 на слое Подеревка_Номера деревьев
Ошибочных: точек 6; текстов номеров 3; блоков 3
Начало файла результатов:
Цитата:
№дер;Название блока;X;Y;Z
Д1;Гари сухостои;47.429;367.177;.000
Д2;Гари сухостои;47.970;376.100;.000
Д3;Дерево Сосна и Кедр;49.748;369.350;.000
Д4;Дерево Мелколиственное;50.100;361.929;.000
Д5;Дерево Мелколиственное;51.835;355.744;.000
Д6;Гари сухостои;52.391;370.871;.000
Д7;Гари сухостои;53.541;351.866;.000
Д8;Дерево Мелколиственное;53.955;356.458;.000
Д9;Дерево Мелколиственное;55.188;361.168;.000
Д10;Дерево Сосна и Кедр;56.604;370.748;.000
и открыть в экселе, установив точку с запятой в качестве разделителя.
Сергей812 вне форума  
 
Непрочитано 09.08.2018, 10:00
#7
trir


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


Цитата:
на .Net это тоже за несколько минут пишется)
на SQL всёравно проще
trir вне форума  
 
Непрочитано 09.08.2018, 10:04
#8
Boxa

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


Коллеги, вроде в разделе чистого автокада находимся, к чему все эти программистские изыски?
В чистом автокаде, ручками, всю эту работу можно минут за 10 сделать...к тому же, как я понял, это единоразовая работа... зачем лишние сущности.
Boxa вне форума  
 
Непрочитано 09.08.2018, 10:12
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Offtop: да так, чисто отвлечься перед рабочей тягомотиной) Может, кого то еще удастся привлечь в .Net - хотя врятли, большинство сидит и ждет готового результата
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.08.2018, 11:05
#10
Dmitry_maccaferri

Инженерная защита территорий
 
Регистрация: 02.04.2010
Москва
Сообщений: 3


Цитата:
Сообщение от Boxa Посмотреть сообщение
и в чем проблема, зачем тут лисп и программирование?
DATAEXTRACTION.
Экспортируйте по отдельности координаты блока и текста в xls файл и просто соберите данные вместе

Выглядеть это будет как то вот так:


Спасибо за мысль! пришлось немного помучиться с сортировкой, т.к. excel в автомате сортировал в следующей последовательности A1, А10, А100, А101... В полном файле еще несколько проблем объявилось (дополнительные блоки, несколько номеров в одной точке и т.д.), но уже всё готово.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
на .Net это тоже за несколько минут пишется)
Сергей812, спасибо!
Dmitry_maccaferri вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Экспорт нумерации блоков в таблицу

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите плиз с программкой по автоматической нумерации Diman111 Программирование 110 30.08.2021 07:18
Подсчет Блоков и Динамических блоков с учетом visibility (видимости) и сумму длин линий, полилиний по слоям и вывод результатов в Ecxel Andrey_nadym Программирование 18 07.01.2014 01:42
Влияет ли разрядность операционной системы и АвтоКАДа на допустимые имена блоков и на их редактирование? Archeo AutoCAD 38 14.08.2013 15:29
Надежна ли такая конструкция из блоков ФБС и ж/б монолитного пояса? kollya Железобетонные конструкции 19 20.06.2013 14:39
Собрать информацию Атрибутов блоков в таблицу Спецификации Sirius2w AutoCAD 41 01.09.2010 13:07