(изменено: gizmo_zx gizmo_zx, 2 ноября 2010г. 11:11:30)

Тема: выбор блоков во тегам атрибутов и

Добрый день.
Есть задача написать программку  аналог q-select на VB.net.
Имеется Autocad 2009 , ObjectARX 2009 (x32), Visual studio 2010 RU.
Нужно отфильтровать блоки по имени атрибута и/или по содержимому атрибута.
Сам алгоритм есть на VBA. Основная проблема выделить блоки для дальнейшей обработки (например копирования и т.д.), т.е. после окончания программы нужные блоки должны остаться выделены.
До этого писал только VBA.
Немного потыкался в Visual studio 2010 RU. Кто возьмется помочь, научить подсказать.
Пока возникли вопросы:
1)    Правильно создать запрос SelectionSet (SelectOnScreen) (с этим уже понятно)
2)    Как оставить выбранными полученные в результате блоки (возможноли выделить все объекты которые подсвечены Highlight) :?:

Re: выбор блоков во тегам атрибутов и

Каждый вопрос по отдельности уже решался на форуме, поищи.

Re: выбор блоков во тегам атрибутов и

gizmo_zx gizmo_zx пишет:

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

Поищи тут.

Re: выбор блоков во тегам атрибутов и

gizmo_zx gizmo_zx пишет:

Добрый день.
Есть задача написать программку аналог q-sel ect на VB.net.
Имеется Autocad 2009 , ObjectARX 2009 (x32), Visual studio 2010 RU.
Нужно отфильтровать блоки по имени атрибута и/или по содержимому атрибута.
Сам алгоритм есть на VBA. Основная проблема выделить блоки для дальнейшей обработки (например копирования и т.д.), т.е. после окончания программы нужные блоки должны остаться выделены.
До этого писал только VBA.
Немного потыкался в Visual studio 2010 RU. Кто возьмется помочь, научить подсказать.
Пока возникли вопросы:
1) Правильно создать запрос SelectionSet (SelectOnScreen) (с этим уже понятно)
2) Как оставить выбранными полученные в результате блоки (возможноли выделить все объекты которые подсвечены Highlight)

Типо

// requires .NET FRAmeWOrk 3.5
using System.Linq;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;

using acad = Autodesk.AutoCAD.ApplicationServices.Application;


[assembly: CommandClass(typeof(BlockSet.Highlight))]
namespace BlockSet
{

    public class Highlight
    {

        [CommandMethod("BHL", CommandFlags.UsePickSet )]

        static public void HighlightByTag()
        {

            Document doc = acad.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;


            Transaction tr =

              doc.TransactionManager.StartTransaction();

            using (tr = doc.TransactionManager.StartTransaction())
            {
                PromptSelectionOptions pso = new PromptSelectionOptions();

                pso.MessageForRemoval = "\n >>  Nothing selected....";

                pso.MessageForAdding = "\n  >>  Select block references >> ";

                pso.AllowDuplicates = false;

                pso.SingleOnly = true;

                SelectionFilter sf = new SelectionFilter
                    (new TypedValue[] { new TypedValue(0, "INSERT"), new TypedValue(66, 1) });

                PromptSelectionResult res = ed.GetSelection(pso, sf);

                if (res.Status != PromptStatus.OK)
                    return;
                ObjectId[] ids = res.Value.GetObjectIds();
              



                if (ids.Count() > 0)
                {


                    PromptResult pr =

                      ed.GetString("\nAttribute Tag? (=>in UPPER CASE only!): ");

                    if (pr.Status == PromptStatus.OK)
                    {

                        string attag = pr.StringResult;


                        if (ids.Count() > 0)
                        {

                            var atinfo = (fr om id in ids
                              let bref = (BlockReference)tr.GetObject(id, OpenMode.ForRead, false)

                              let atcol = (AttributeCollection)bref.AttributeCollection
                              fr om at in atcol.OfType<Ob jectId>()
                              let atref = (AttributeReference)tr.GetObject(at, OpenMode.ForRead, false)
                              wh ere atref.Tag == attag
                              select bref).ToList();

                            acad.ShowAlertDialog(string.Format("Selected: {0} blocks\ncontaining  \"{1}\" attribute", atinfo.Count(), attag));

                            foreach (var blk in atinfo)
                            {
                              var hid = new ObjectId[] { blk.ObjectId };
                              Entity ent = blk as Entity;

                              SubentityId subid = new SubentityId(SubentityType.Null, 0);

                              FullSubentityPath path = new FullSubentityPath(hid, subid);

                              if (ent != null)
                              
                              ent.Highlight(path, true);
                              ent.SetGripStatus(GripStatus.GripsDone);

                            }
                        }
                        else
                        {
                            acad.ShowAlertDialog(string.Format("No blockdSelected");
                        }

                        }
                    
                        tr.Commit();
                    }


                }

            }

        }
    }

[FONT=Arial]~'J'~[/FONT]

Re: выбор блоков во тегам атрибутов и

Всем спасибо.
Решил тут http://forum.dwg.ru/showthread.php?t=65131