dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вставка динамического блока по двум точкам и как при этом схватить за grip полярного параметра

Вставка динамического блока по двум точкам и как при этом схватить за grip полярного параметра

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 11.01.2017, 07:20 #1
Вставка динамического блока по двум точкам и как при этом схватить за grip полярного параметра
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™

Red Nova вне форума Вставить имя

Доброго,

Тут выяснил что более-менее нормального варианта на лисп нет.
По этому решил создать отдельную тему в общем разделе и спросить Вас товарищи, может у кого имеется подобное реализованное на другом языке (то бишь выклянчить)? Уверено что это возможно так как подглядел у одного коллеги, и больно понравилось, а у него и не взять . Надеюсь админы простят дубляж в таком формате.

Собственно дублирую вопрос.
Имею динамический блок, у него есть полярный параметр.
Ищу возможность вставить блок командой с указанием двух точек, но при этом хочу чтобы после указания первой точки блок "висел на курсоре"
По аналогии с прорисовкой обычной линии, после указания первой точки линия следует за курсором.
По сути нужно после вставки блока взяться за грисп нашего полярного параметра и указать вторую точку.
Могу написать похожий код на лиспе но без "висения на курсоре".

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

Подопытный прикреплен.

Вложения
Тип файла: dwg
DWG 2013
test.dwg (42.9 Кб, 12 просмотров)

__________________
Блог
Просмотров: 2508
 
Непрочитано 11.01.2017, 10:14
#2
Boxa

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


Так что ли ?


Кодов полно, велкам:
http://adn-cis.org/forum/index.php?topic=7545.0
http://adn-cis.org/forum/index.php?topic=7251.0
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.01.2017, 17:59
#3
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Ну если в гифке действие с динамическим блоком, и растягивается он взявшись за "grip", то да . Но мне в кодах не на лиспе не разобраться. Может кто поделиться готовым вариантом?
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.01.2017, 18:59
#4
Boxa

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
действие с динамическим блоком
да
Цитата:
Сообщение от Red Nova Посмотреть сообщение
растягивается он взявшись за "grip"
да, но в конкретно этом случае дергается два грипа
Цитата:
Сообщение от Red Nova Посмотреть сообщение
Но мне в кодах не на лиспе не разобраться.
Вот тут помочь ничем не могу, для меня Lisp- китайская грамота. Хотя на просторах интернета не встречал JIG на LISP, но вдруг...
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.01.2017, 19:22
#5
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Дык я на лиспе и не ищу. На лиспе так не получается. Поэтому ищу если кто поделится готовым кодом на любом другом языке.
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.01.2017, 20:04
#6
Boxa

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Поэтому ищу если кто поделится готовым кодом на любом другом языке.
Дык я вроде поделился, код на С#... еще раз эту ссылку вставлю http://adn-cis.org/forum/index.php?topic=7545.0

Вам поправить то в коде нужно только:
названия блока - строка 31,
базовый угол - строка 32
имена параметров - строки 191, 195

Если блок без атрибутов, то все отработает нормально. Должно... теоретически, но именно на Вашем блоке я не проверял, могу завтра посмотреть...
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.01.2017, 20:32
#7
Сергей812


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


Оформите Net-функцию в виде lisp-функции, загружаете сборку и вызываете из лисп программы

Код:
[Выделить все]
[LispFunction( "%Имя функции%" )]
public TypedValue %Имя функции%( ResultBuffer aArgsFunc )
{
... Код на Net
}

Последний раз редактировалось Сергей812, 11.01.2017 в 20:42.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.01.2017, 23:08
#8
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Не кидаийесь помидорами, но я не знаю как сделать то что Вы описываете.
С лиспом просто - переименовал текстовой файл в *.lsp и загружай...
Поищу в инете как компилируют код С в то что можно скормить акаду (предполагаю fas)?
Между тем, если есть соответствующий ФАК, прошу направить.
Аналогично не понял и сообщения от Сергей812 (.NET и С это то же самое ? Какое расширение должно быть у такого кода?).
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.01.2017, 00:03
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,817


Код С ACAD'у не подсунешь. Тебе привели код на C#, который компилируется в .NET-сборку (*.dll), загружаемую в ACAD командой _.netload
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.01.2017, 00:34
#10
Сергей812


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Аналогично не понял и сообщения от Сергей812 (.NET и С это то же самое ? Какое расширение должно быть у такого кода?).
это будет Net-сборка, как описывал выше Алексей. Но код, использующий технологию Net Api (что дал ссылки Boxa) и оформленный в виде, как я показал - после загрузки _netload будем вызывать как любая другая лисп-функция.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.01.2017, 02:16
#11
frostmourn


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


Red Nova! Специально не хотел здесь писать для соблюдения направленности раздела, там смотрите http://forum.dwg.ru/showpost.php?p=1...postcount=3205
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 12.01.2017, 04:38
#12
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


kpblc, Сергей812, Boxa - По результатам поиска пошел скачивать Visual Studio Community 2015. Потыкаю. Правильно понял что код с C# можно компилировать в .NET-сборку (*.dll) этой программой? Поправьте если не туда пошел )).
frostmourn - Ответил там же.
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.01.2017, 07:18
#13
Boxa

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


Процетирую
Цитата:
Сообщение от Red Nova Посмотреть сообщение
Огорчает что osnap тут неполноценный и не реагирует на все привязки. Еще нет поддержки ortho / polar.
Справедливости ради должен заметить, что в приведенном по моей ссылке коде отсутствуют динамические размеры и привязки, добавить их не сложно, но мне было не нужно.

Цитата:
Сообщение от Red Nova Посмотреть сообщение
Правильно понял что код с C# можно компилировать в .NET-сборку (*.dll) этой программой?
Скажем так, в этой программе это сделать удобнее, однако при желании и установленном .NET Framework это можно сделать и в консоли.

Цитата:
Сообщение от Boxa Посмотреть сообщение
Должно... теоретически, но именно на Вашем блоке я не проверял, могу завтра посмотреть...
Проверил. Работает

Последний раз редактировалось Boxa, 12.01.2017 в 08:21. Причина: Проверка работы программы с блоком от Nova
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 13.01.2017, 05:03
#14
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Помогите плиз преодолеть первый ступор.
AutoCAD у меня 2016.
Поставил Visual Studio Community 2015
Потом последовательно ObjectARX 2016 и 2017.
Ожидал что в шаблонах появится Autodesk, но этого не произошло.
Прочитал что с такого шаблона начинать не обязательно и пошел через Class Library с последующим добавлением References.
Все шаги делаю по данному пособию. Оно хоть и для Visual Studio 2010 но вроде все кнопки приблизительно там же. Пока решил тестовый пример сделать. Повторяю все действия и дошел до пункта 13.
Build Solution вместо Build Succeeded выдает Build Failed.
Есть идеи что я не так делаю?

Вот пробный код. Скриншот с проекта с ошибками также прикрепляю.
Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.Runtime
using Autodesk.AutoCAD.ApplicationServices
using Autodesk.AutoCAD.DatabaseServices
using Autodesk.AutoCAD.Geometry
using Autodesk.AutoCAD.EditorInput


[assembly: CommandClass(typeof(CSharpPlugin.Class1))]

namespace CSharpPlugin
{
    public class Class1
    {
        [CommandMethod("MyCommand")]
        public void MyCommand()
        {
            Application.ShowAlertDialog("Hello World")
        }
    }
}
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 14
Размер:	82.3 Кб
ID:	182014  
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.01.2017, 05:53
1 | #15
Boxa

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


VS вам прямо говорит, что Вы забыли поставить ";" в конце строк.
В С, С++, С#, php, java и других языках, конец строки требуется оформлять точкой с запятой...
Так же проверьте, что бы у добавленных Вами библиотек автокада свойство "копировать локально" было равно false
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 13.01.2017, 07:22
#16
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Спасибо. Помогло .
Теперь постепенно усложню.
Прикреплен другой блок, на этот раз стальной балки, но принцип тот же (тянем за полярный параметр). Но у этого блока есть атрибут. В атрибут по умолчанию записано "поле" ссылающееся на "lookup".
Ваш код переписывает значение атрибута на ?
По видимому тут:
attRef.TextString = "?";
Мне этого не нужно, а нужно "поле" что и было по умолчанию.
Попытался закомментировать данную строчку.
Теперь вместо "?" в атрибуте сперва отображается не значение "lookup" а почему-то его имя "Beam Size", а после регенерации и вовсе "#####"
Кроме этого также перемещается положение атрибута, тогда как его трогать мне не нужно.
Поможете?

Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using App = Autodesk.AutoCAD.ApplicationServices;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gem = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

[assembly: Rtm.CommandClass(typeof(temp_blkJIG.Commands))]

namespace temp_blkJIG
{
    public class Commands
    {
        [Rtm.CommandMethod("qwert")]
        static public void qwert()
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            if (doc == null) return;

            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;


            double baseAngle;
            string strBlockName = "BMP Plan W Beam Top";
            baseAngle = 0;// 


            //тут нужен ID блока в таблице блоков
            Db.ObjectId blockDefId = GetBlockIDbyName(db, strBlockName);
            if (blockDefId == Db.ObjectId.Null)
                return;

            Db.ObjectId blockRefId = Jig.CreateBlockWithJig(blockDefId);
            blockRefId = Jig.ModifyBlockWithJig(blockRefId, baseAngle);
        }


        /// <summary>
        /// Проверка наличия нужного блока в базе чертежа
        /// </summary>
        /// <param name="strBlockName">Имя искомого блока</param>
        private static Db.ObjectId GetBlockIDbyName(Db.Database db, string strBlockName)
        {
            Db.ObjectId blockRecId = Db.ObjectId.Null;
            using (Db.Transaction tr1 = db.TransactionManager.StartTransaction())
            {
                Db.BlockTable blockTable = (Db.BlockTable)tr1.GetObject(db.BlockTableId,
                                                                    Db.OpenMode.ForRead);

                if (blockTable.Has(strBlockName))
                    blockRecId = blockTable[strBlockName];
                else
                    blockRecId = Db.ObjectId.Null;
            }
            // Все еще можно получить Db.ObjectId.Null для передачи.
            return blockRecId;
        } //GetBlockIDbyName
    }


    public static class Jig
    {
        private static Dictionary<string, Gem.Point3d> _attPos;
        public static Db.ObjectId CreateBlockWithJig(Db.ObjectId blockId)
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;

            Db.ObjectId id = Db.ObjectId.Null;
            _attPos = new Dictionary<string, Gem.Point3d>();


            using (Db.Transaction tr = doc.TransactionManager.StartTransaction())
            {
                // Then open the block table and check the
                // block definition exists
                Db.BlockTable bt = (Db.BlockTable)tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead);

                //Db.BlockTableRecord blockTableRecFindBlock = (Db.BlockTableRecord)tr.GetObject(blockId, Db.OpenMode.ForRead);

                // Create the block reference and
                // add it to the jig
                Gem.Point3d pt = new Gem.Point3d(0, 0, 0);
                Db.BlockReference br = new Db.BlockReference(pt, blockId);

                br.Layer = "0";

                br.Visible = false;

                if (br.Annotative == Db.AnnotativeStates.True)
                    AddScale(br);


                // entity to the modelspace
                Db.BlockTableRecord btr = (Db.BlockTableRecord)tr.GetObject(
                    bt[Db.BlockTableRecord.ModelSpace],
                    Db.OpenMode.ForWrite);

                id = btr.AppendEntity(br);
                tr.AddNewlyCreatedDBObject(br, true);


                Db.BlockTable blockTable = (Db.BlockTable)tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead);
                Db.BlockTableRecord blockTableRecFindBlock = (Db.BlockTableRecord)tr.GetObject(blockTable[br.Name], Db.OpenMode.ForRead);

                if (blockTableRecFindBlock.HasAttributeDefinitions)
                {
                    foreach (Db.ObjectId idAtt in blockTableRecFindBlock)
                    {
                        Db.DBObject obj = idAtt.GetObject(Db.OpenMode.ForRead);
                        Db.AttributeDefinition attDef = obj as Db.AttributeDefinition;
                        if ((attDef != null) && (!attDef.Constant))
                        {
                            _attPos.Add(attDef.Tag, attDef.Position);

                            using (Db.AttributeReference attRef = new Db.AttributeReference())
                            {
                                if (attRef.Annotative == Db.AnnotativeStates.True)
                                    AddScale(attRef);

                                attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
                                //attRef.TextString = "?";



                                attRef.SetDatabaseDefaults(db);

                                br.AttributeCollection.AppendAttribute(attRef);
                                tr.AddNewlyCreatedDBObject(attRef, true);
                            }
                        }
                    }
                }
                tr.Commit();
            }


            using (Db.Transaction tr1 = db.TransactionManager.StartTransaction())
            {
                Db.BlockReference br = (Db.BlockReference)tr1.GetObject(id, Db.OpenMode.ForWrite);
                BlockJigInsert entJigIns = new BlockJigInsert(tr1, br);
                // Perform the jig operation
                Ed.PromptResult pr = ed.Drag(entJigIns);
                if (pr.Status == Ed.PromptStatus.OK)
                {
                    if (br.AttributeCollection.Count != 0)
                    {
                        foreach (Db.ObjectId idAttr in br.AttributeCollection)
                        {
                            Db.DBObject obj = tr1.GetObject(idAttr, Db.OpenMode.ForRead);
                            Db.AttributeReference ar = obj as Db.AttributeReference;
                            // Apply block transform to att def position
                            if (ar != null)
                            {


                            }
                        }
                    }
                    // Call a function to make the graphics display
                    // (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush();
                }
                tr1.Commit();
            }
            return id;
        }


        public static Db.ObjectId ModifyBlockWithJig(Db.ObjectId blockId, Double baseAngle)
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;
            using (Db.Transaction tr = doc.TransactionManager.StartTransaction())
            {


                Db.BlockReference br = (Db.BlockReference)tr.GetObject(blockId, Db.OpenMode.ForWrite);


                List<BlockParam> pList = new List<BlockParam>();
                BlockParam blParam1 = new BlockParam("Length",
                    Db.DynamicBlockReferencePropertyUnitsType.Distance,
                    10);

                BlockParam blParam2 = new BlockParam("Angle1",
                    Db.DynamicBlockReferencePropertyUnitsType.Angular,
                    baseAngle);
                pList.Add(blParam1);
                pList.Add(blParam2);

                //BlockJigModify entJigMod = new BlockJigModify(br,"Distance1");
                BlockJigModify entJigMod = new BlockJigModify(tr, br, pList);
                Ed.PromptResult pr = ed.Drag(entJigMod);
                if (pr.Status == Ed.PromptStatus.OK)
                {

                    // Call a function to make the graphics display
                    // (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush();
                }
                tr.Commit();
            }
            return Db.ObjectId.Null;
        }




        /// <summary>
        /// Добавление анатативных масштабов к блокам
        /// </summary>
        /// <param name="ent">Db.Entity ent - объект блока, которому будет добавлена анатативность</param>
        public static void AddScale(Db.Entity ent)
        {

            Db.Database db = App.Application.DocumentManager.MdiActiveDocument.Editor.Document.Database;

            Db.ObjectContextManager ocm = db.ObjectContextManager;
            Db.ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
            Db.ObjectContext curAnnoScale = occ.GetContext(db.Cannoscale.Name);

            ent.AddContext(curAnnoScale);
            foreach (Db.ObjectContext scale in occ)
            {
                if (scale.Name != curAnnoScale.Name && ent.HasContext(scale))
                    ent.RemoveContext(scale);
            }
        } // class AddScale

    }



    class BlockJigInsert : Ed.EntityJig
    {
        private readonly Gem.Tolerance tolerance = new Gem.Tolerance(1, 1);
        private Gem.Point3d _pos;
        private Dictionary<string, Gem.Point3d> _attPos;
        private Db.Transaction _tr;

        public BlockJigInsert(Db.Transaction tr, Db.BlockReference br)
          : base(br)
        {
            _pos = br.Position;
            br.Visible = true;
            // Initialize our dictionary with the tag /
            // AttributeDefinition position

            _attPos = new Dictionary<string, Gem.Point3d>();
            _tr = tr;

            Db.BlockTableRecord btr = (Db.BlockTableRecord)_tr.GetObject(br.BlockTableRecord, Db.OpenMode.ForRead);

            if (btr.HasAttributeDefinitions)
            {
                foreach (Db.ObjectId id in btr)
                {
                    Db.DBObject obj =
                      tr.GetObject(id, Db.OpenMode.ForRead);
                    Db.AttributeDefinition ad =
                      obj as Db.AttributeDefinition;

                    if (ad != null)
                    {
                        _attPos.Add(ad.Tag, ad.Position);

                    }
                }
            }
        }

        protected override bool Update()
        {
            Db.BlockReference br = Entity as Db.BlockReference;

            br.Position = _pos;

            if (br.AttributeCollection.Count != 0)
            {
                foreach (Db.ObjectId id in br.AttributeCollection)
                {
                    Db.DBObject obj = _tr.GetObject(id, Db.OpenMode.ForRead);
                    Db.AttributeReference ar = obj as Db.AttributeReference;
                    // Apply block transform to att def position
                    if (ar != null)
                    {
                        ar.UpgradeOpen();
                        ar.Position = _attPos[ar.Tag].TransformBy(br.BlockTransform);
                        ar.DowngradeOpen();
                    }
                }
            }
            return true;
        }


        protected override Ed.SamplerStatus Sampler(Ed.JigPrompts prompts)
        {
            Ed.JigPromptPointOptions opts =
              new Ed.JigPromptPointOptions("\nSelect insertion point:");
            opts.BasePoint = new Gem.Point3d(0, 0, 0);
            opts.UserInputControls =
              Ed.UserInputControls.NoZeroResponseAccepted;

            Ed.PromptPointResult ppr = prompts.AcquirePoint(opts);


            //Для точек
            if (ppr.Value.IsEqualTo(this._pos, tolerance))
                return Ed.SamplerStatus.NoChange;

            this._pos = ppr.Value;

            return Ed.SamplerStatus.OK;
        }

        //public Ed.PromptStatus Run()
        //{
        //    App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
        //    Ed.Editor ed = doc.Editor;
        //    Ed.PromptResult promptResult = ed.Drag(this);
        //    return promptResult.Status;
        //}


        public Db.Entity GetEntity()
        {
            return Entity;
        }

    }


    class BlockJigModify : Ed.EntityJig
    {
        private List<BlockParam> _paramList;
        Gem.Point3d mCenterPt, mActualPoint;
        private readonly Gem.Tolerance tolerance = new Gem.Tolerance(0.1, 0.1);
        private readonly Gem.Matrix3d currentUCS;
        private readonly Gem.CoordinateSystem3d curUCS;

        //private Gem.Point3d _pos;
        private Dictionary<string, Gem.Point3d> _attPos;
        private Db.Transaction _tr;

        public BlockJigModify(Db.Transaction tr, Db.BlockReference br, List<BlockParam> ParamList)
         : base(br)
        {

            currentUCS = cad.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
            curUCS = currentUCS.CoordinateSystem3d;

            mCenterPt = br.Position.TransformBy(currentUCS);
            _paramList = ParamList;

            br.Visible = true;
            // Initialize our dictionary with the tag /
            // AttributeDefinition position

            _attPos = new Dictionary<string, Gem.Point3d>();
            _tr = tr;

            if (br.AttributeCollection.Count > 0)
            {
                foreach (Db.ObjectId arId in br.AttributeCollection)
                {
                    Db.AttributeReference ar = _tr.GetObject(arId, Db.OpenMode.ForRead) as Db.AttributeReference;

                    Gem.Point3d p1 = ar.Position;
                    Gem.Vector3d v1 = curUCS.Origin.GetVectorTo(mCenterPt);
                    p1 = p1.TransformBy(Gem.Matrix3d.Displacement(v1));

                    _attPos.Add(ar.Tag, p1);
                }
            }
        }


        protected override Ed.SamplerStatus Sampler(Ed.JigPrompts prompts)
        {
            Ed.JigPromptPointOptions jigOpts = new Ed.JigPromptPointOptions();
            jigOpts.UserInputControls =
              (Ed.UserInputControls.Accept3dCoordinates
              | Ed.UserInputControls.NoZeroResponseAccepted
              | Ed.UserInputControls.NoNegativeResponseAccepted
              | Ed.UserInputControls.GovernedByOrthoMode);
            jigOpts.Message = "\nEnter insert point: ";
            Ed.PromptPointResult dres = prompts.AcquirePoint(jigOpts);

            if (mActualPoint.IsEqualTo(dres.Value, tolerance))
                return Ed.SamplerStatus.NoChange;

            mActualPoint = dres.Value;
            return Ed.SamplerStatus.OK;
        }


        protected override bool Update()
        {
            //mCenterPt = mActualPoint;
            try
            {
                double ugol = 0;
                double dist = 0;

                Db.BlockReference blockRef = (Db.BlockReference)Entity;

                Db.DynamicBlockReferencePropertyCollection dynBlockRefProp = blockRef.DynamicBlockReferencePropertyCollection;
                foreach (Db.DynamicBlockReferenceProperty prop in dynBlockRefProp)
                {
                    BlockParam blPr = (from q in _paramList
                                       where (q.ParamName == prop.PropertyName) && (q.ParamType == prop.UnitsType)
                                       select q).FirstOrDefault();

                    if (blPr != null)
                    {
                        if (blPr.ParamType == Db.DynamicBlockReferencePropertyUnitsType.Angular)
                        {
                            //prop.Value = -mCenterPt.GetVectorTo(mActualPoint).GetAngleTo(Gem.Vector3d.XAxis, Gem.Vector3d.ZAxis);
                            ugol = blPr.ParamMinValue - mCenterPt.GetVectorTo(mActualPoint).GetAngleTo(Gem.Vector3d.XAxis, Gem.Vector3d.ZAxis);
                            prop.Value = ugol;


                            foreach (KeyValuePair<string, Gem.Point3d> j in _attPos)
                                _attPos[j.Key] = _attPos[j.Key].TransformBy(Gem.Matrix3d.Rotation(ugol, curUCS.Zaxis, blockRef.Position));

                        }


                        if (blPr.ParamType == Db.DynamicBlockReferencePropertyUnitsType.Distance)
                        {
                            dist = mCenterPt.DistanceTo(mActualPoint);
                            if (dist > blPr.ParamMinValue)
                            {
                                prop.Value = dist;
                                //foreach (KeyValuePair<string, Gem.Point3d> j in _attPos)
                                //    _attPos[j.Key] = _attPos[j.Key].TransformBy(Gem.Matrix3d.Displacement(mCenterPt.GetVectorTo(mActualPoint)));
                            }
                        }


                        //if (blockRef.AttributeCollection.Count != 0)
                        //{
                        //    foreach (Db.ObjectId id in blockRef.AttributeCollection)
                        //    {
                        //        Db.DBObject obj = _tr.GetObject(id, Db.OpenMode.ForRead);
                        //        Db.AttributeReference ar = obj as Db.AttributeReference;
                        //        // Apply block transform to att def position
                        //        if (ar != null)
                        //        {
                        //            //Gem.Point3d p1 = _attPos[ar.Tag];
                        //            //ar.UpgradeOpen();
                        //            //Gem.Vector3d v1 = mCenterPt.GetVectorTo(mActualPoint);
                        //            //p1 = p1.TransformBy(Gem.Matrix3d.Displacement(v1));
                        //            //ar.Position = p1;
                        //            //ar.DowngradeOpen();
                        //        }
                        //    }
                        //}
                    }
                }
            }
            catch (System.Exception)
            {
                return false;
            }
            return true;
        }

        public Db.Entity GetEntity()
        {
            return Entity;
        }
    }


    public class BlockParam
    {
        private string _paramName;
        private Db.DynamicBlockReferencePropertyUnitsType _paramUnitsType;
        private double _paramMinValue;


        public BlockParam(string Name,
            Db.DynamicBlockReferencePropertyUnitsType Type,
            double MinValue)
        {
            ParamName = Name;
            ParamType = Type;
            ParamMinValue = MinValue;

        }


        public string ParamName
        {
            get
            {
                return _paramName;
            }

            set
            {
                _paramName = value;
            }
        }

        public Db.DynamicBlockReferencePropertyUnitsType ParamType
        {
            get
            {
                return _paramUnitsType;
            }

            set
            {
                _paramUnitsType = value;
            }
        }

        public double ParamMinValue
        {
            get
            {
                return _paramMinValue;
            }

            set
            {
                _paramMinValue = value;
            }
        }
    }
}
Вложения
Тип файла: dwg
DWG 2013
test2.dwg (47.9 Кб, 8 просмотров)
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.01.2017, 08:50
#17
Boxa

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


Поля нужно создавать самостоятельно, это отдельные объекты, которые вставляются в атрибут.
По поводу косяка с атрибутами, то я про это писал с 6 сообщении, хотя решение проблемы есть по указанной мной ссылке....
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.01.2017, 16:16
#18
Сергей812


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


Мне больше нравиться (в силу лени) вместо подобного кода
Код:
[Выделить все]
if (blockTable.Has(strBlockName))
                    blockRecId = blockTable[strBlockName];
                else
                    blockRecId = Db.ObjectId.Null;
писать
Код:
[Выделить все]
blockRecId = blockTable.Has(strBlockName) ? blockTable[strBlockName] : Db.ObjectId.Null;
но это дело вкуса, конечно.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.01.2017, 18:05
#19
Boxa

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


Сергей812, синтаксический сахарок... =о)

ЗЫ.
Только сейчас обратил внимание, что Red Nova зачем то сюда, на dwg, притащил весь код без изменений с adn-cis, зачем.... там бы и обсуждали, тем более, что он там зарегистрирован и там больше компетентных специалистов....
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 14.01.2017, 09:15
#20
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Цитата:
Поля нужно создавать самостоятельно, это отдельные объекты, которые вставляются в атрибут.
Жаль что с этим сложности.
Как вариант можно вставить этим кодом подставной блок без атрибута, затем его удалить и вставить нормальный блок командным методом.

Чтобы продолжить на лиспе мне нужно закатать этот код в функцию как предлагал Сергей812. Попробовал сделать как указано в сообщении но как не кручу постоянно ошибки выходят.Видно не туда или не так вставляю строки. Помогите пожалуйста, и измените код ниже так чтобы была функция вместо команды.
В идеале было бы удобно вывести название блока а также длины и угла полярного параметра в аргумент. И дальше функция подошла бы к любому подобному блоку. Это конечно не критично, но было бы удобно.

Цитата:
Только сейчас обратил внимание, что Red Nova зачем то сюда, на dwg, притащил весь код без изменений с adn-cis, зачем.... там бы и обсуждали, тем более, что он там зарегистрирован и там больше компетентных специалистов....
А что тут плохого? Я там зарегистрировался только чтобы этот код скачать. А тема у меня тут.

Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using App = Autodesk.AutoCAD.ApplicationServices;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gem = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

[assembly: Rtm.CommandClass(typeof(temp_blkJIG.Commands))]

namespace temp_blkJIG
{
    public class Commands
    {
        [Rtm.CommandMethod("qwert")]
        static public void qwert()
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            if (doc == null) return;

            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;


            double baseAngle;
            string strBlockName = "BMP Plan IT";
            baseAngle = 0;// baseAngle = -Math.PI / 2;


            //тут нужен ID блока в таблице блоков
            Db.ObjectId blockDefId = GetBlockIDbyName(db, strBlockName);
            if (blockDefId == Db.ObjectId.Null)
                return;

            Db.ObjectId blockRefId = Jig.CreateBlockWithJig(blockDefId);
            blockRefId = Jig.ModifyBlockWithJig(blockRefId, baseAngle);
        }


        /// <summary>
        /// Проверка наличия нужного блока в базе чертежа
        /// </summary>
        /// <param name="strBlockName">Имя искомого блока</param>
        private static Db.ObjectId GetBlockIDbyName(Db.Database db, string strBlockName)
        {
            Db.ObjectId blockRecId = Db.ObjectId.Null;
            using (Db.Transaction tr1 = db.TransactionManager.StartTransaction())
            {
                Db.BlockTable blockTable = (Db.BlockTable)tr1.GetObject(db.BlockTableId,
                                                                    Db.OpenMode.ForRead);

                if (blockTable.Has(strBlockName))
                    blockRecId = blockTable[strBlockName];
                else
                    blockRecId = Db.ObjectId.Null;
            }
            // Все еще можно получить Db.ObjectId.Null для передачи.
            return blockRecId;
        } //GetBlockIDbyName
    }


    public static class Jig
    {
        private static Dictionary<string, Gem.Point3d> _attPos;
        public static Db.ObjectId CreateBlockWithJig(Db.ObjectId blockId)
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;

            Db.ObjectId id = Db.ObjectId.Null;
            _attPos = new Dictionary<string, Gem.Point3d>();


            using (Db.Transaction tr = doc.TransactionManager.StartTransaction())
            {
                // Then open the block table and check the
                // block definition exists
                Db.BlockTable bt = (Db.BlockTable)tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead);

                //Db.BlockTableRecord blockTableRecFindBlock = (Db.BlockTableRecord)tr.GetObject(blockId, Db.OpenMode.ForRead);

                // Create the block reference and
                // add it to the jig
                Gem.Point3d pt = new Gem.Point3d(0, 0, 0);
                Db.BlockReference br = new Db.BlockReference(pt, blockId);

                br.Layer = "0";

                br.Visible = false;

                if (br.Annotative == Db.AnnotativeStates.True)
                    AddScale(br);


                // entity to the modelspace
                Db.BlockTableRecord btr = (Db.BlockTableRecord)tr.GetObject(
                    bt[Db.BlockTableRecord.ModelSpace],
                    Db.OpenMode.ForWrite);

                id = btr.AppendEntity(br);
                tr.AddNewlyCreatedDBObject(br, true);


                Db.BlockTable blockTable = (Db.BlockTable)tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead);
                Db.BlockTableRecord blockTableRecFindBlock = (Db.BlockTableRecord)tr.GetObject(blockTable[br.Name], Db.OpenMode.ForRead);

                if (blockTableRecFindBlock.HasAttributeDefinitions)
                {
                    foreach (Db.ObjectId idAtt in blockTableRecFindBlock)
                    {
                        Db.DBObject obj = idAtt.GetObject(Db.OpenMode.ForRead);
                        Db.AttributeDefinition attDef = obj as Db.AttributeDefinition;
                        if ((attDef != null) && (!attDef.Constant))
                        {
                            _attPos.Add(attDef.Tag, attDef.Position);

                            using (Db.AttributeReference attRef = new Db.AttributeReference())
                            {
                                if (attRef.Annotative == Db.AnnotativeStates.True)
                                    AddScale(attRef);

                                attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
                                //attRef.TextString = "?";



                                attRef.SetDatabaseDefaults(db);

                                br.AttributeCollection.AppendAttribute(attRef);
                                tr.AddNewlyCreatedDBObject(attRef, true);
                            }
                        }
                    }
                }
                tr.Commit();
            }


            using (Db.Transaction tr1 = db.TransactionManager.StartTransaction())
            {
                Db.BlockReference br = (Db.BlockReference)tr1.GetObject(id, Db.OpenMode.ForWrite);
                BlockJigInsert entJigIns = new BlockJigInsert(tr1, br);
                // Perform the jig operation
                Ed.PromptResult pr = ed.Drag(entJigIns);
                if (pr.Status == Ed.PromptStatus.OK)
                {
                    if (br.AttributeCollection.Count != 0)
                    {
                        foreach (Db.ObjectId idAttr in br.AttributeCollection)
                        {
                            Db.DBObject obj = tr1.GetObject(idAttr, Db.OpenMode.ForRead);
                            Db.AttributeReference ar = obj as Db.AttributeReference;
                            // Apply block transform to att def position
                            if (ar != null)
                            {


                            }
                        }
                    }
                    // Call a function to make the graphics display
                    // (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush();
                }
                tr1.Commit();
            }
            return id;
        }


        public static Db.ObjectId ModifyBlockWithJig(Db.ObjectId blockId, Double baseAngle)
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database db = doc.Database;
            Ed.Editor ed = doc.Editor;
            using (Db.Transaction tr = doc.TransactionManager.StartTransaction())
            {


                Db.BlockReference br = (Db.BlockReference)tr.GetObject(blockId, Db.OpenMode.ForWrite);


                List<BlockParam> pList = new List<BlockParam>();
                BlockParam blParam1 = new BlockParam("Length",
                    Db.DynamicBlockReferencePropertyUnitsType.Distance,
                    10);

                BlockParam blParam2 = new BlockParam("Angle1",
                    Db.DynamicBlockReferencePropertyUnitsType.Angular,
                    baseAngle);
                pList.Add(blParam1);
                pList.Add(blParam2);

                //BlockJigModify entJigMod = new BlockJigModify(br,"Distance1");
                BlockJigModify entJigMod = new BlockJigModify(tr, br, pList);
                Ed.PromptResult pr = ed.Drag(entJigMod);
                if (pr.Status == Ed.PromptStatus.OK)
                {

                    // Call a function to make the graphics display
                    // (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush();
                }
                tr.Commit();
            }
            return Db.ObjectId.Null;
        }




        /// <summary>
        /// Добавление анатативных масштабов к блокам
        /// </summary>
        /// <param name="ent">Db.Entity ent - объект блока, которому будет добавлена анатативность</param>
        public static void AddScale(Db.Entity ent)
        {

            Db.Database db = App.Application.DocumentManager.MdiActiveDocument.Editor.Document.Database;

            Db.ObjectContextManager ocm = db.ObjectContextManager;
            Db.ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
            Db.ObjectContext curAnnoScale = occ.GetContext(db.Cannoscale.Name);

            ent.AddContext(curAnnoScale);
            foreach (Db.ObjectContext scale in occ)
            {
                if (scale.Name != curAnnoScale.Name && ent.HasContext(scale))
                    ent.RemoveContext(scale);
            }
        } // class AddScale

    }



    class BlockJigInsert : Ed.EntityJig
    {
        private readonly Gem.Tolerance tolerance = new Gem.Tolerance(1, 1);
        private Gem.Point3d _pos;
        private Dictionary<string, Gem.Point3d> _attPos;
        private Db.Transaction _tr;

        public BlockJigInsert(Db.Transaction tr, Db.BlockReference br)
          : base(br)
        {
            _pos = br.Position;
            br.Visible = true;
            // Initialize our dictionary with the tag /
            // AttributeDefinition position

            _attPos = new Dictionary<string, Gem.Point3d>();
            _tr = tr;

            Db.BlockTableRecord btr = (Db.BlockTableRecord)_tr.GetObject(br.BlockTableRecord, Db.OpenMode.ForRead);

            if (btr.HasAttributeDefinitions)
            {
                foreach (Db.ObjectId id in btr)
                {
                    Db.DBObject obj =
                      tr.GetObject(id, Db.OpenMode.ForRead);
                    Db.AttributeDefinition ad =
                      obj as Db.AttributeDefinition;

                    if (ad != null)
                    {
                        _attPos.Add(ad.Tag, ad.Position);

                    }
                }
            }
        }

        protected override bool Update()
        {
            Db.BlockReference br = Entity as Db.BlockReference;

            br.Position = _pos;

            if (br.AttributeCollection.Count != 0)
            {
                foreach (Db.ObjectId id in br.AttributeCollection)
                {
                    Db.DBObject obj = _tr.GetObject(id, Db.OpenMode.ForRead);
                    Db.AttributeReference ar = obj as Db.AttributeReference;
                    // Apply block transform to att def position
                    if (ar != null)
                    {
                        ar.UpgradeOpen();
                        ar.Position = _attPos[ar.Tag].TransformBy(br.BlockTransform);
                        ar.DowngradeOpen();
                    }
                }
            }
            return true;
        }


        protected override Ed.SamplerStatus Sampler(Ed.JigPrompts prompts)
        {
            Ed.JigPromptPointOptions opts =
              new Ed.JigPromptPointOptions("\nSelect insertion point:");
            opts.BasePoint = new Gem.Point3d(0, 0, 0);
            opts.UserInputControls =
              Ed.UserInputControls.NoZeroResponseAccepted;

            Ed.PromptPointResult ppr = prompts.AcquirePoint(opts);


            //Для точек
            if (ppr.Value.IsEqualTo(this._pos, tolerance))
                return Ed.SamplerStatus.NoChange;

            this._pos = ppr.Value;

            return Ed.SamplerStatus.OK;
        }

        //public Ed.PromptStatus Run()
        //{
        //    App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
        //    Ed.Editor ed = doc.Editor;
        //    Ed.PromptResult promptResult = ed.Drag(this);
        //    return promptResult.Status;
        //}


        public Db.Entity GetEntity()
        {
            return Entity;
        }

    }


    class BlockJigModify : Ed.EntityJig
    {
        private List<BlockParam> _paramList;
        Gem.Point3d mCenterPt, mActualPoint;
        private readonly Gem.Tolerance tolerance = new Gem.Tolerance(0.1, 0.1);
        private readonly Gem.Matrix3d currentUCS;
        private readonly Gem.CoordinateSystem3d curUCS;

        //private Gem.Point3d _pos;
        private Dictionary<string, Gem.Point3d> _attPos;
        private Db.Transaction _tr;

        public BlockJigModify(Db.Transaction tr, Db.BlockReference br, List<BlockParam> ParamList)
         : base(br)
        {

            currentUCS = cad.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
            curUCS = currentUCS.CoordinateSystem3d;

            mCenterPt = br.Position.TransformBy(currentUCS);
            _paramList = ParamList;

            br.Visible = true;
            // Initialize our dictionary with the tag /
            // AttributeDefinition position

            _attPos = new Dictionary<string, Gem.Point3d>();
            _tr = tr;

            if (br.AttributeCollection.Count > 0)
            {
                foreach (Db.ObjectId arId in br.AttributeCollection)
                {
                    Db.AttributeReference ar = _tr.GetObject(arId, Db.OpenMode.ForRead) as Db.AttributeReference;

                    Gem.Point3d p1 = ar.Position;
                    Gem.Vector3d v1 = curUCS.Origin.GetVectorTo(mCenterPt);
                    p1 = p1.TransformBy(Gem.Matrix3d.Displacement(v1));

                    _attPos.Add(ar.Tag, p1);
                }
            }
        }


        protected override Ed.SamplerStatus Sampler(Ed.JigPrompts prompts)
        {
            Ed.JigPromptPointOptions jigOpts = new Ed.JigPromptPointOptions();
            jigOpts.UserInputControls =
              (Ed.UserInputControls.Accept3dCoordinates
              | Ed.UserInputControls.NoZeroResponseAccepted
              | Ed.UserInputControls.NoNegativeResponseAccepted
              | Ed.UserInputControls.GovernedByOrthoMode);
            jigOpts.Message = "\nEnter insert point: ";
            Ed.PromptPointResult dres = prompts.AcquirePoint(jigOpts);

            if (mActualPoint.IsEqualTo(dres.Value, tolerance))
                return Ed.SamplerStatus.NoChange;

            mActualPoint = dres.Value;
            return Ed.SamplerStatus.OK;
        }


        protected override bool Update()
        {
            //mCenterPt = mActualPoint;
            try
            {
                double ugol = 0;
                double dist = 0;

                Db.BlockReference blockRef = (Db.BlockReference)Entity;

                Db.DynamicBlockReferencePropertyCollection dynBlockRefProp = blockRef.DynamicBlockReferencePropertyCollection;
                foreach (Db.DynamicBlockReferenceProperty prop in dynBlockRefProp)
                {
                    BlockParam blPr = (from q in _paramList
                                       where (q.ParamName == prop.PropertyName) && (q.ParamType == prop.UnitsType)
                                       select q).FirstOrDefault();

                    if (blPr != null)
                    {
                        if (blPr.ParamType == Db.DynamicBlockReferencePropertyUnitsType.Angular)
                        {
                            //prop.Value = -mCenterPt.GetVectorTo(mActualPoint).GetAngleTo(Gem.Vector3d.XAxis, Gem.Vector3d.ZAxis);
                            ugol = blPr.ParamMinValue - mCenterPt.GetVectorTo(mActualPoint).GetAngleTo(Gem.Vector3d.XAxis, Gem.Vector3d.ZAxis);
                            prop.Value = ugol;


                            foreach (KeyValuePair<string, Gem.Point3d> j in _attPos)
                                _attPos[j.Key] = _attPos[j.Key].TransformBy(Gem.Matrix3d.Rotation(ugol, curUCS.Zaxis, blockRef.Position));

                        }


                        if (blPr.ParamType == Db.DynamicBlockReferencePropertyUnitsType.Distance)
                        {
                            dist = mCenterPt.DistanceTo(mActualPoint);
                            if (dist > blPr.ParamMinValue)
                            {
                                prop.Value = dist;
                                //foreach (KeyValuePair<string, Gem.Point3d> j in _attPos)
                                //    _attPos[j.Key] = _attPos[j.Key].TransformBy(Gem.Matrix3d.Displacement(mCenterPt.GetVectorTo(mActualPoint)));
                            }
                        }


                        //if (blockRef.AttributeCollection.Count != 0)
                        //{
                        //    foreach (Db.ObjectId id in blockRef.AttributeCollection)
                        //    {
                        //        Db.DBObject obj = _tr.GetObject(id, Db.OpenMode.ForRead);
                        //        Db.AttributeReference ar = obj as Db.AttributeReference;
                        //        // Apply block transform to att def position
                        //        if (ar != null)
                        //        {
                        //            //Gem.Point3d p1 = _attPos[ar.Tag];
                        //            //ar.UpgradeOpen();
                        //            //Gem.Vector3d v1 = mCenterPt.GetVectorTo(mActualPoint);
                        //            //p1 = p1.TransformBy(Gem.Matrix3d.Displacement(v1));
                        //            //ar.Position = p1;
                        //            //ar.DowngradeOpen();
                        //        }
                        //    }
                        //}
                    }
                }
            }
            catch (System.Exception)
            {
                return false;
            }
            return true;
        }

        public Db.Entity GetEntity()
        {
            return Entity;
        }
    }


    public class BlockParam
    {
        private string _paramName;
        private Db.DynamicBlockReferencePropertyUnitsType _paramUnitsType;
        private double _paramMinValue;


        public BlockParam(string Name,
            Db.DynamicBlockReferencePropertyUnitsType Type,
            double MinValue)
        {
            ParamName = Name;
            ParamType = Type;
            ParamMinValue = MinValue;

        }


        public string ParamName
        {
            get
            {
                return _paramName;
            }

            set
            {
                _paramName = value;
            }
        }

        public Db.DynamicBlockReferencePropertyUnitsType ParamType
        {
            get
            {
                return _paramUnitsType;
            }

            set
            {
                _paramUnitsType = value;
            }
        }

        public double ParamMinValue
        {
            get
            {
                return _paramMinValue;
            }

            set
            {
                _paramMinValue = value;
            }
        }
    }
}
__________________
Блог

Последний раз редактировалось Red Nova, 14.01.2017 в 18:22.
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вставка динамического блока по двум точкам и как при этом схватить за grip полярного параметра

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка блока из чертежа исходя из двух параметров (длина и ширина) Kairat.iskakov LISP 6 17.05.2016 15:04
Вставка блока с атрибутами. Как сделать правильно? Kirill_Ja Программирование 7 18.03.2013 00:22
Правильность применения операции полярного растяжения для динамического блока E_note AutoCAD 2 22.01.2012 14:22
Вставка динамического блока из библиотеки с потерей аннотативности Jonas AutoCAD 20 04.12.2011 19:45
Странное поведение динамического блока высотной отметки hwd AutoCAD 12 08.09.2011 11:15

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы