Выбор ключевого слова и Нижняя черта (_)

Автор Тема: Выбор ключевого слова и Нижняя черта (_)  (Прочитано 28812 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Ну я предупреждал...
И да, я знаю что перебирать все объекты в модели это дурной тон, с наскоку получить вхождения блоков из таблицы не получилось, какой то затык с измененными дин блоками (пример работы смотрел тут http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html , но видимо не разобрался до конца). Позже этот фрагмент программы перепишу адаптирую.
Да и использование переменных класса без сетеров и геторов "не айс"...

update. (2014-05-12)
При редактирование исправил код основного модуля:
 - добавил предварительный выбор
 - добавил фильтр при переборе объектов в модели.

Код - C# [Выбрать]
  1. // Основной модуль
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Windows.Forms;
  6.  
  7. using App = Autodesk.AutoCAD.ApplicationServices;
  8. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  9. using Db = Autodesk.AutoCAD.DatabaseServices;
  10. using Ed = Autodesk.AutoCAD.EditorInput;
  11. using Gem = Autodesk.AutoCAD.Geometry;
  12. using Rtm = Autodesk.AutoCAD.Runtime;
  13. using Gi = Autodesk.AutoCAD.GraphicsInterface;
  14.  
  15. namespace QuickSelect
  16. {
  17.     public class Commands
  18.     {
  19.         public static List<string> AttList = new List<string>();
  20.         public static string AttValue = "";
  21.         private static string Exit = "Exit";
  22.  
  23.         static public void ClearAttListValue()
  24.         {
  25.             AttValue = "";
  26.             AttList.Clear();
  27.             AttList.Add(Exit);
  28.         }
  29.  
  30.  
  31.         [Rtm.CommandMethod("bx_quickselect", Rtm.CommandFlags.UsePickSet  |
  32.                                              Rtm.CommandFlags.Redraw |
  33.                                              Rtm.CommandFlags.Modal)]
  34.         static public void bx_quickselect()
  35.         {
  36.             // Получение текущего документа и базы данных
  37.             App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  38.             Db.Database acCurDb = acDoc.Database;
  39.             Ed.Editor acEd = acDoc.Editor;
  40.             ClearAttListValue();
  41.  
  42.             //Секция предварительного выбора
  43.             Ed.PromptSelectionResult acSSPrompt = acEd.SelectImplied();
  44.             Ed.SelectionSet acSSet = null;
  45.  
  46.             // Если статус запроса OK, объекты были выбраны перед запуском команды
  47.             if (acSSPrompt.Status == Ed.PromptStatus.OK)
  48.                             acSSet = acSSPrompt.Value;
  49.  
  50.             Dictionary<Db.ObjectId, string> ObjID_Dic = new Dictionary<Db.ObjectId, string>();
  51.  
  52.             Ed.PromptEntityOptions EntOpt = new Ed.PromptEntityOptions("\n Select block:");
  53.             EntOpt.SetRejectMessage("\n Entity must be a block.");
  54.             EntOpt.AddAllowedClass(typeof(Db.BlockReference), false);
  55.             EntOpt.AllowObjectOnLockedLayer = true;
  56.             Ed.PromptEntityResult EntRes = acEd.GetEntity(EntOpt);
  57.  
  58.             if (EntRes.Status != Ed.PromptStatus.OK)
  59.             {
  60.                 acEd.WriteMessage("\n Cencel.");
  61.                 return;
  62.             }
  63.  
  64.             String acBlockName = "0";
  65.  
  66.             // старт транзакции
  67.             // Ищу истенное имя выбранного блока и читаю его атрибуты
  68.             using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  69.             {
  70.                 // Открытие таблицы Блоков для чтения
  71.                 Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  72.                                                 Db.OpenMode.ForRead) as Db.BlockTable;
  73.                 // Открытие записи таблицы Блоков пространства Модели для записи
  74.                 Db.BlockTableRecord acBlkTblRecMS = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
  75.                                                 Db.OpenMode.ForRead) as Db.BlockTableRecord;
  76.                
  77.                 //Получаю выбранный блок
  78.                 Db.BlockReference acBlock = acTrans.GetObject(EntRes.ObjectId, Db.OpenMode.ForRead) as Db.BlockReference;
  79.                 //Получаю определение блока в таблице блоков
  80.                 Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlock.BlockTableRecord, Db.OpenMode.ForRead)
  81.                     as Db.BlockTableRecord;
  82.      
  83.  
  84.                 // Получаю определение блока в таблице динамических блоков
  85.                 // Запоминаю истинное имя блока
  86.                 acBlockName = acBlock.Name;
  87.  
  88.                 if (acBlock.IsDynamicBlock)
  89.                 {
  90.                     acBlkTblRec = acTrans.GetObject(acBlock.DynamicBlockTableRecord, Db.OpenMode.ForRead) as Db.BlockTableRecord;
  91.                     Db.BlockTableRecord blr_nam = acTrans.GetObject(acBlkTblRec.ObjectId, Db.OpenMode.ForRead) as Db.BlockTableRecord;
  92.                     acBlockName = blr_nam.Name;
  93.                 }
  94.  
  95.                 if (acBlkTblRec.HasAttributeDefinitions)
  96.                 {
  97.                     foreach (Db.ObjectId objID in acBlkTblRec)
  98.                     {
  99.                         Db.DBObject dbObj = acTrans.GetObject(objID, Db.OpenMode.ForRead) as Db.DBObject;
  100.                         if (dbObj is Db.AttributeDefinition)
  101.                         {
  102.                             Db.AttributeDefinition acAtt = dbObj as Db.AttributeDefinition;
  103.                             if (AttList.Contains(acAtt.Tag) != true)
  104.                                 AttList.Add(acAtt.Tag);
  105.                         }
  106.                     }
  107.                 }
  108.                 //Я в этой транзакции ничего не меняю, Все открываю только для чтения.
  109.                 //соответственно и вносить изменения не нужно.
  110.                 //acTrans.Commit();
  111.             }
  112.  
  113.  
  114.             if (AttList.Count == 1)
  115.                 return;
  116.  
  117.             QuickSelect.Form1 myform_name = new QuickSelect.Form1();
  118.             Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myform_name);
  119.  
  120.             if (AttValue == Exit)
  121.                 return;
  122.  
  123.             string AttName = AttValue;
  124.             // Вот тут нужно очистить переменные
  125.             ClearAttListValue();
  126.             //// тут получить все возможние значения данного атрибута и
  127.             //// заполним массив AttList снова вызвать форму
  128.             using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  129.             {
  130.                 if (acSSet == null)
  131.                 {
  132.                     Db.TypedValue[] acTypValAr = new Db.TypedValue[1];
  133.                     Db.TypedValue typedValue = new Db.TypedValue(0, "INSERT");
  134.                     acTypValAr.SetValue(typedValue, 0);
  135.                     Ed.SelectionFilter acSelFtr = new Ed.SelectionFilter(acTypValAr);
  136.                     acSSPrompt = acEd.SelectAll(acSelFtr);
  137.                     acSSet = acSSPrompt.Value;
  138.                 }
  139.  
  140.                 foreach (Db.ObjectId objID in acSSet.GetObjectIds())
  141.                 {
  142.                     // Проверка, нужно убедится в правильности полученного объекта
  143.                     if (objID != null)
  144.                     {
  145.                         // Открытие объекта для
  146.                         Db.Entity dbObj = acTrans.GetObject(objID, Db.OpenMode.ForRead) as Db.Entity;
  147.                         if (dbObj != null)
  148.                         {
  149.                             if (dbObj is Db.BlockReference)
  150.                             {
  151.                                 Db.BlockReference acBlock = dbObj as Db.BlockReference;
  152.                                 Db.BlockTableRecord acBlkTblRec;
  153.                                 acBlkTblRec = acTrans.GetObject(acBlock.BlockTableRecord, Db.OpenMode.ForRead) as Db.BlockTableRecord;
  154.  
  155.                                 String BlockName = acBlock.Name;
  156.                                 if (acBlock.IsDynamicBlock)
  157.                                 {
  158.                                     acBlkTblRec = acTrans.GetObject(acBlock.DynamicBlockTableRecord, Db.OpenMode.ForRead) as Db.BlockTableRecord;
  159.                                     Db.BlockTableRecord blr_nam = acTrans.GetObject(acBlkTblRec.ObjectId, Db.OpenMode.ForRead) as Db.BlockTableRecord;
  160.                                     BlockName = blr_nam.Name;
  161.                                 }
  162.  
  163.                                 if (BlockName == acBlockName)
  164.                                 {
  165.                                     if (acBlkTblRec.HasAttributeDefinitions)
  166.                                     {
  167.                                         foreach (Db.ObjectId objID_In_Block in acBlock.AttributeCollection)
  168.                                         {
  169.                                             Db.DBObject dbObj_In_Block = acTrans.GetObject(objID_In_Block, Db.OpenMode.ForRead) as Db.DBObject;
  170.                                             if (dbObj_In_Block is Db.AttributeReference)
  171.                                             {
  172.                                                 Db.AttributeReference acAtt = dbObj_In_Block as Db.AttributeReference;
  173.                                                 if (acAtt.Tag == AttName)
  174.                                                 {
  175.                                                     ObjID_Dic.Add(acBlock.ObjectId, acAtt.TextString);
  176.  
  177.                                                     if (AttList.Contains(acAtt.TextString) == false)
  178.                                                         AttList.Add(acAtt.TextString);
  179.                                                 }
  180.                                             }
  181.                                         }
  182.                                     }
  183.                                 }
  184.                             }
  185.                         }
  186.                     }
  187.                 }
  188.                 //Я в этой транзакции ничего не меняю, Все открываю только для чтения.
  189.                 //соответственно и вносить изменения не нужно.
  190.                 //acTrans.Commit();
  191.             }
  192.  
  193.            //Выводим форму для выбора значения
  194.             QuickSelect.Form1 myform_value = new QuickSelect.Form1();
  195.             Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myform_value);
  196.  
  197.             if (AttValue == Exit)
  198.                 return;
  199.             // Добавляем в набор выбираемых объекты удовлетворяющие условию
  200.             IEnumerable<Db.ObjectId> L = from KeyValuePair<Db.ObjectId, string> q in ObjID_Dic
  201.                                          where q.Value.ToString() == AttValue.ToString()
  202.                                          select q.Key;
  203.             //Подсвечиваем объекты
  204.             Db.ObjectId[] idarrayEmpty = L.ToArray();
  205.             acEd.SetImpliedSelection(idarrayEmpty);
  206.         }
  207.     }
  208. }

Код - C# [Выбрать]
  1. // Форма
  2. using System;
  3. using System.Windows.Forms;
  4. namespace QuickSelect
  5. {
  6.     public partial class Form1 : Form
  7.     {
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }
  12.         private void Form1_Load(object sender, EventArgs e)
  13.         {
  14.             foreach(string str in QuickSelect.Commands.AttList)
  15.             {
  16.                 listBox1.Items.Add(str);
  17.             }
  18.         }
  19.  
  20.         private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  21.         {
  22.             try
  23.             {
  24.                 QuickSelect.Commands.AttValue = listBox1.SelectedItem.ToString();
  25.                 this.Close();
  26.             }
  27.             catch (Exception)
  28.             {
  29.                
  30.                 //throw;
  31.             }
  32.         }
  33.     }
  34. }
  35.  
« Последнее редактирование: 12-05-2014, 17:02:42 от Boxa.Shu »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Код - C# [Выбрать]
  1. listBox1.Items.AddRange(QuickSelect.Commands.AttList);
и тогда можно, наверное, обойтись без BeginUpdate и EndUpdate.

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Код - C# [Выбрать]
  1. listBox1.Items.AddRange(QuickSelect.Commands.AttList);
и тогда можно, наверное, обойтись без BeginUpdate и EndUpdate.
Угу, можно. Проверил и поправил код.