Последние сообщения

Последние сообщения

Страницы: 1 [2] 3 4 ... 10
11
Александр, спасибо Вам большое. Теперь все работает!
12
Кстати, этот код работает в текущем чертеже, загруженом в редактор AutoCAD? Если нет, то следует еще и переключить рабочую базу на эту базу, а по завершении переключить обратно.
13
Почему не пользуешься методом setAttributeFromBlock?
14
ObjectARX / Alignment Point для AttributeDefinition. Разница между ObjectArx и .NET
« Последний ответ от exilerus 21-12-2025, 21:39:38 »
Здравствуйте.

Перевожу своё приложение из .NET API для автокада в ObjectArx на Mac OS. Столкнулся с определенным вопросом, связанным с расположением AttributeDefinition

Код - C++ [Выбрать]
  1.     pAttDef->setTag(wtag.c_str());
  2.     pAttDef->setLayer(wlayer.c_str());
  3.     pAttDef->setTextString(wtext.c_str());
  4.     pAttDef->setHeight(height);
  5.     pAttDef->setVisibility(invisible ? AcDb::kInvisible : AcDb::kVisible);
  6.     pAttDef->setLockPositionInBlock(true);
  7.     pAttDef->setHorizontalMode(AcDb::kTextCenter);
  8.     pAttDef->setAlignmentPoint(position);
  9.  

Данный кусок у меня создает AcDbAttribute

Код - C++ [Выбрать]
  1. AcDbAttribute* pAtt = new AcDbAttribute();
  2.                         pAtt->setPropertiesFrom(pAttDef);
  3.  
  4.                         AcGePoint3d attPos = pAttDef->position();
  5.                         attPos += pBlkRef->position().asVector();
  6.                         pAtt->setPosition(attPos);
  7.  
  8.                         pAtt->setHeight(pAttDef->height());
  9.                         pAtt->setTag(pAttDef->tag());
  10.                         pAtt->setTextString(pAttDef->textString());
  11.  
  12.                         Acad::ErrorStatus es = pBlkRef->appendAttribute(pAtt);
  13.                         if (es != Acad::eOk) {
  14.                             pAtt->erase();
  15.                         }
  16.                         pAtt->close();
  17.  

Данный код размещает все, как нужно, но Alignment Point сдвинут влево. То есть, если я надумаю руками поменять значение атрибута потом, он у меня сдвинется. Пример на картинке.




Подскажите, пожалуйста, есть ли возможность, чтобы при изменении значения атрибута текст был центрирован?

Второй вопрос, это почему у меня так много grip points? для сравнения этот же блокреференс из  .NET? (На ширину внимания не обращайте).

Заранее спасибо и буду очень благодарен за любой пинок в правильном направлении.






15
А может есть возможность держать принтер например в пределах .bundle
Это возможно.
В настройках, Файл/Путь к вспомогательным файлам печати можно добавлять другие папки поиска, например к своему плагину.
16
Уважаемый Александр.
А может есть возможность держать принтер например в пределах .bundle (например, c:\Users\xxxx\AppData\Roaming\Autodesk\ApplicationPlugins\yyyy.bundle\Contents\Resources\Plotters\)
И при установке / инициализации аддона добавлять путь к нему, pmp-файлу и т.д.
Как по вашему лучше? (особенно если bundle мультиплатформенный)
17
Черт! Что-то я тормознул. Полноценного конструктора у класса нет, но свойства-то доступны для записи  ;D
Вот так работает:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// назначить стандартный или пользовательский масштаб
  3.     /// </summary>
  4.     public static void
  5.     SetScale(this Viewport vp, double scale)
  6.     {
  7.       if (vp is null || double.IsNaN(scale) || scale < MinScale) return;
  8.       StandardScaleType std = FindStdScale(scale, vp.Database);
  9.       double oldScale = vp.CustomScale;
  10.       if (std != StandardScaleType.CustomScale)
  11.         vp.StandardScale = std;
  12.       else vp.CustomScale = scale;
  13.       if (vp.Database != null && oldScale != vp.CustomScale)
  14.       {
  15.         ObjectContextManager ocm = vp.Database.ObjectContextManager;
  16.         ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  17.         bool found = false;
  18.         foreach (AnnotationScale oldAnnoScale in occ)
  19.           if (Abs(oldAnnoScale.Scale - vp.CustomScale) < ScaleTolerance)
  20.           {
  21.             vp.AnnotationScale = oldAnnoScale;
  22.             found = true;
  23.             break;
  24.           }
  25.         if (!found)
  26.         {
  27.           //Добавление масштаба к чертежу
  28.           AnnotationScale newScale = new()
  29.           {
  30.             Name = $"CustomScale {vp.CustomScale}x",
  31.             PaperUnits = vp.CustomScale,
  32.             DrawingUnits = 1
  33.           };
  34.           occ.AddContext(newScale);
  35.           vp.AnnotationScale = newScale;
  36.         }
  37.       }
  38.     }
18
Но как создать нестандартные?
Выше сообщение изменил, как добавлять. В collectionScales  все масштабы хранятся. Скорее всего можно все масштабы изменить, но один должен всегда присутствовать, т.к. много мест с масштабом по умолчанию.
19
Спасибо. Стандартные масштабы похоже всегда присутствуют в этом словаре. Но как создать нестандартные?
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// назначить стандартный или пользовательский масштаб
  3.     /// </summary>
  4.     public static void
  5.     SetScale(this Viewport vp, double scale)
  6.     {
  7.       if (vp is null || double.IsNaN(scale) || scale < MinScale) return;
  8.       StandardScaleType std = FindStdScale(scale, vp.Database); // моя процедура подбора масштаба из стандартных
  9.       double oldScale = vp.CustomScale;
  10.       if (std != StandardScaleType.CustomScale)
  11.         vp.StandardScale = std;
  12.       else vp.CustomScale = scale;
  13.       if (vp.Database != null && oldScale != vp.CustomScale)
  14.       {
  15.         ObjectContextManager ocm = vp.Database.ObjectContextManager;
  16.         ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  17.         bool found = false;
  18.         foreach (AnnotationScale ac in occ)
  19.           if (Abs(ac.Scale - vp.CustomScale) < ScaleTolerance)
  20.           {
  21.             vp.AnnotationScale = ac;
  22.             found = true;
  23.             break;
  24.           }
  25.         if (!found)
  26.           //occ.AddContext(new AnnotationScale()); // надо создавать новый AnnotationScale, но непонятно как
  27.           vp.AnnotationScale = vp.Database.Cannoscale;
  28.       }
  29.     }
20
Свойство AnnotationScale имеет публичный сеттер, но этого объекта очень мутные конструкторы, ни StandardScaleType, ни масштаб как double они не принимают (а в некоторых других API вообще нет публичных конструкторов). Похоже надо как-то получить этот объект из БД чертежа. Но как?

Скорее всего нужно извлекать реально существующий масштаб из списка масштабов текущего чертежа, его и назначать.

Код - C# [Выбрать]
  1. ObjectContextManager contextManager = db.ObjectContextManager;
  2. if (contextManager != null)
  3. {
  4.    ObjectContextCollection collectionScales = contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");//Получение списка масштабов в текущем чертеже
  5.    foreach (AnnotationScale scale in collectionScales)
  6.    {
  7.       scales.Add(scale);
  8.    }
  9.    //или текущий.
  10.    AnnotationScale currentScale = (AnnotationScale)collectionScales.CurrentContext;
  11.  
  12.    //Добавление масштаба к чертежу
  13.    AnnotationScale scale = new AnnotationScale();
  14.    scale.Name = "MyScale 1:28";
  15.    scale.PaperUnits = 1;
  16.    scale.DrawingUnits = 28;
  17.    collectionScales.AddContext(scale);
  18.  
  19.    //Добавление к аннотативному объекту
  20.    ObjectContext objectContext = collectionScales.GetContext("MyScale 1:28");
  21.    anotativeObject.AddContext(objectContext );
  22. }



Страницы: 1 [2] 3 4 ... 10