Тема: Определение параметра видимости DynamicBlockReferenceProperty

День добрый.
Как у параметра динамического блока определить, что приндлежность к видимости.
По сути, когда вставляешь этот параметр видимости в редакторе блока, то он говорит, что такой параметр уже есть на чертеже ( то есть он может сущестовать только один у динамического блока).
На деле же проверяю динамический блок на наличие параметров и не могу понять, что отвечает за этот параметр видимости.

Думал, что свойство Show отвечает за это. Но это не так. потому что следующим кодом нахожу два параметра динамического блока - один тот, что мне нужен, второй - ненужный мне.

            using (Transaction transact = DBDrawing.TransactionManager.StartTransaction())
            {
                BlockReference refBlock = 
                                transact.GetObject(IdRefBlock, OpenMode.ForRead) as BlockReference;
                DynamicBlockReferencePropertyCollection collectionProperties = 
                                refBlock.DynamicBlockReferencePropertyCollection;
                
                foreach (DynamicBlockReferenceProperty property in collectionProperties)
                {
                    if (!property.PropertyName.Equals("Origin"))
                    {
                        if (property.Show)
                        {
                            foreach (object value in property.GetAllowedValues())
                            {
                                // тут я получаю значения
                            }
                        }                        
                    }
                }
            }

Как можно узнать параметр видимости?
Заранее благодарю за помощь.

Re: Определение параметра видимости DynamicBlockReferenceProperty

Один из этих параметров является параметром выбора. Второй - параметром видимости.

Re: Определение параметра видимости DynamicBlockReferenceProperty

смотрите property.PropertyTypeCode
у параметра видимости он равен 5

Re: Определение параметра видимости DynamicBlockReferenceProperty

в том то и дело. он равен 5 и у параметра выбора и у параметра видимости
сейчас еще раз проверил.

Re: Определение параметра видимости DynamicBlockReferenceProperty

на всякий случай, чтобы не быть голословным
ссылочка на чертеж

Re: Определение параметра видимости DynamicBlockReferenceProperty

Попробуй так, на скорую руку набросал:

        [CommandMethod("DCB", CommandFlags.UsePickSet)]
        public static void ChangeDynBlock()
        {
            Document oDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            
            Editor ed = oDoc.Editor;

            Database db = HostApplicationServices.WorkingDatabase;

            using (DocumentLock dlock = oDoc.LockDocument()) 
            {             
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                        try
                        {
                            BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));

                            PromptEntityOptions peo = new PromptEntityOptions("\nPlease, select a block: ");
                            peo.SetRejectMessage("\nYou have to select BlockReference only!");
                            peo.AllowNone = false;
                            peo.AllowObjectOnLockedLayer = true;
                            peo.AddAllowedClass(typeof(BlockReference), false);
                            PromptEntityResult per = ed.GetEntity(peo);
                            if (per.Status != PromptStatus.OK) return;
                            ObjectId objId = per.ObjectId;
                            if (!objId.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(BlockReference))))
                            {
                                ed.WriteMessage("\nYou didn't select a BlockReference, please try again...\n");
                                return;
                            }
       
                            
                            BlockReference bref = (BlockReference)trans.GetObject(objId, OpenMode.ForRead);

                            DynamicBlockReferencePropertyCollection dpcoll = bref.DynamicBlockReferencePropertyCollection;

                            for (int n = 0; n < dpcoll.Count; n++)//iteration is just for the future programm
                            {
                                DynamicBlockReferenceProperty vizz = dpcoll[n];

                                switch (vizz.PropertyName.ToUpper())
                                {
                                    case "ТИП ТАБЛИЦЫ":
                                        
                                        Object[] props = vizz.GetAllowedValues();

                                        PromptKeywordOptions pko = new PromptKeywordOptions("");

                                        for (int m = 0; m < props.Length; m++)
                                            
                                        pko.Keywords.Add(props[m].ToString());

                                        pko.Keywords.Default = props[0].ToString();
                                        
                                        pko.AllowArbitraryInput = true;
                                        
                                        pko.AllowNone = true;
                                        
                                        pko.Message = "\nChoose a visibility item from list (Экспликация): ";// setup your item to suit
                                        
                                        pko.AppendKeywordsToMessage = true;
                                        
                                        PromptResult prr = ed.GetKeywords(pko);
                                        
                                        string typ = prr.StringResult.ToString();
                                        
                                        vizz.Value = typ;

                                        break;

                                }

                            }

                        }
                        catch (Autodesk.AutoCAD.Runtime.Exception ex)
                        {
                            System.Windows.Forms.MessageBox.Show(ex.Message +
                                          
 "\n------------------------------------------\n" +
                                           ex.StackTrace);
                        }
                        trans.Commit();
                    }
                //}
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="tr"></param>
        /// <param name="blkref"></param>
        /// <returns>Block Name</returns>
        public static string EffectiveName(Transaction tr, BlockReference blkref)
        {
            if (blkref.IsDynamicBlock)
            {
                using (BlockTableRecord obj = (BlockTableRecord)
                   
                    tr.GetObject(blkref.DynamicBlockTableRecord, OpenMode.ForRead))
                    
                    return obj.Name;
            }
            return blkref.Name;
        }

Re: Определение параметра видимости DynamicBlockReferenceProperty

Хитро =)

Суть моей задачи заключается в замене старой версии блока на новую версию с сохранением значений параметров. При этом соответствие параметров блоков устанавливается пользователем.
Подобных блоков будет несколько. и у каждого свой параметр видимости. Поэтому этот вариант не подходит.
То есть если все-таки этот вариант использовать и в switch прописать кучу условий, то потом при создании нового блока, а вместе с ним и параметра видимости с новым именем (отличным от тех, что прописаны в switch), он не будет учитываться моей функцией.

(изменено: Виталич Круглов, 15 октября 2013г. 06:49:04)

Re: Определение параметра видимости DynamicBlockReferenceProperty

То есть PropertyTypeCode = 5 отвечает за параметр видимости (ну и наверное за параметр выбора)?
а параметр Show вообще за что отвечает?