Обнаружена ошибка API. Из примера StarsPlugin, класс StarObject:
Код
protected override PropertyChange EditProperties()
{
StarPropertiesDialog dialog = new StarPropertiesDialog(this);
Document doc = this.Owner2D.Document;
PropertyChange result = PropertyChange.Nothing;
if (dialog.ShowDialog())
{
doc.BeginChanges("Изменить параметры звезды");
StarObject newStar = Owner2D.VolatileObject as StarObject;
newStar.Assign(dialog.Star);
newStar.ApplyReferences(dialog.Star);
doc.EndChanges();
result = PropertyChange.Regenerate;
}
return result;
}
Ожидается регенерация модели после изменения параметров объекта, но этого не происходит. После закрытия документа изменения объекта не сохраняются.
Последовательность действий 1. Создайте новый документ. 2. Создайте объект "Звезда". 3. Сохраните документ. 4. На вкладке "Элементы модели" выберете объект и нажмите контекстное меню "Параметры...", чтобы внести изменения. Затем нажмите "ОК". 5. Закройте документ.
Ошибку также можно воспроизвести если запустить "Пример приложения к T-FLEX CAD StarsPlugin.dll" из меню "Приложения". Версия T-FLEX CAD 17.1.6.0
1. Скачайте повторно архив и извлеките содержимое. 2. В командной строке введите сдедующее: [CODE] TFPackageManager.exe --api-info [/CODE] в корне каталога приложения появится текстовый файл [B]api-loader.log[/B], содержимое которого должно быть примерно следующим: [CODE] T-FLEX CAD APILoader Info
Culture : en-US FileLinksAutoRefresh : SystemDefault IsDOCsEnabled : False IsMacrosEnabled : False IsSessionInitialized : True InterfaceLanguage : Russian MeasuringSystem : Metric Product : TFlexCad3D RegistryName : SOFTWARE\Top Systems\T-FLEX CAD API 17\Rus StudentVersion : False SystemPath : C:\Program Files\T-FLEX CAD 17\Program\ Version : 17.1.0.0 [/CODE] или [CODE] Failed to initialize API... [/CODE] если по какой то причине API не был загружен...
[QUOTE]Иван Секретов написал: 2. 17.1.0.0[/QUOTE] Такое случается из-за несовместимости API с приложением. Я обновил архив с бинарными файлами. Скачайте обновленную сборку приложения по той же ссылке...
[B]Примечание[/B] 1. В Open T-FLEX CAD API добавлено много функций. В частности, некоторые из них затрагивают API, связанные с классом ExportToPDF. Текущее обновление просто повышает версию API без надлежащего анализа и тестирования. 2. Минимальная поддерживаемая версия T-FLEX CAD API 17.1.0.0
Hydra, зависание возникает при запуске отладчика непосредственно в редакторе макросов... эта ошибка уже давно наблюдается (не помню точно с какой версии)...
[QUOTE]ainis написал: Можно ли с помощью API для конфигураций модели изменить набор значений переменных?[/QUOTE] Странный вопрос. Конфигурации -- это набор состояний общих геометрических данных. Конфигурации применяются на уровне сборки с тем состоянием, которое вы определили в документе фрагмента (текущая конфигурация). Как я понял, вы хотите изменить состояние переменных текущей конфигурации при включении в сборку... только не понятно зачем так усложнять?! Если вам нужны динамические фрагменты, на мой взгляд, конфигурации не лучший вариант для этого. Возможно, стоит рассмотреть вариант создания адаптивных фрагментов с пользовательскими данными в составе изделия (нужно проверять).
Sasha написал: А почему если на проекции есть линии, круги и т.п. такая проблема разрушить проекцию?
В T-FLEX CAD 17 проекция создается на основе нового типа страницы "Проекция". По умолчанию этот тип страницы скрыт. Чтобы отобразить этот тип на вкладке, нужно установить галку в диалоге "Страницы" (см. раздел: Страницы документа). Насколько я понимаю, новый тип страницы "Проекция" выполняет ту же роль, что и тип страницы "Вспомогательная" для чертежного вида, только для проекций (к сожалению, в справочнике не так много информации). Возможно, то что вам нужно, уже реализовано...
[QUOTE]ainis написал: Можно ли как-то получить TFlex.Model.Document?[/QUOTE] Нет, этот API предоставляет независимую объектную модель (ограниченную в плане управления документом). По сути, компонент [B]TFlex.CAD.Server.DLL[/B] обеспечивает доступ к серверной части T-FLEX CAD для работы с документом в асинхронном режиме. В отличии от приложения, построенного на базе [B]TFlexAPI.DLL[/B], серверный компонент позволяет обрабатывать запросы от нескольких клиентов одновременно. То есть, принципиальное отличие в том, что документ не блокируется на запись, если он (документ) уже открыт по запросу другого клиента.
[QUOTE]ainis написал: как подключиться к уже запущенному T-Flex'у и получить активный документ?[/QUOTE] Скачайте проект [URL=https://disk.yandex.ru/d/jqSsw0pGU6YByw]ServerTest[/URL] (см. ReadMe.txt в архиве).
[QUOTE]ainis написал: Как сделать так, чтобы это окно было открыто, не подскажете?[/QUOTE] ну, это не очень хорошая идея... нужно писать в техподдержку, и прикрепить ссылку на эту тему...
[QUOTE]ainis написал: У меня почему-то для всех составов это свойство - False.[/QUOTE] Я уже писал об этом ранее, [QUOTE] класс "ProductStructure" содержит свойство "IsShownInProductStructureWindow", но оно будет работать [B]только при открытом окне[/B] "Состав изделия" [/QUOTE] Нужно писать в техподдержку по этому вопросу. Скорее всего это баг API. --- Ещё в API есть статический метод [B]ProductStructure.GetActiveProductStructure[/B], который, по идее, должен возвращать ссылку на объект [B]ProductStructure[/B], но к сожалению и тут засада... :-) метод всегда возвращает [B]null[/B]...
[QUOTE]ainis написал: А можно как-нибудь добраться до ячейки с помощью дескриптора ParameterDescriptor, не задавая его GUID?[/QUOTE] Можно последовательно перебрать дескрипторы в цикле, например: [CODE] var scheme = ps.GetScheme(); foreach (ParameterDescriptor descriptor in scheme.Parameters) { foreach (RowElement row in ps.GetAllRowElements()) { var cell = row[descriptor];
Оказывается проблема не в координатах, это связано с привязкой к узлам. Я создал вручную параграф (см. граф зависимостей: tflexcad-paragraph-info-1.PNG) и сравнил с результатом, полученным при выполнении макроса (см. граф зависимостей: tflexcad-paragraph-info-2.PNG). На втором снимке видно, что отсутствует "Узел 2". Что характерно, в T-FLEX CAD 12 то же самое... :-) Чтобы получить координаты узлов, нужно отделить операцию создания узлов от операции создания параграфа. [CODE] using TFlex; using TFlex.Model; using TFlex.Model.Model2D;
namespace Test { public class ParagraphBuilder { static readonly Document document = Application.ActiveDocument;
public static void Run() { if (document == null) return; var page = document.ActiveView.Page; if (page == null) return;
document.BeginChanges("Create Nodes");
var lc1 = new LineConstruction(document) { Page = page }; lc1.SetVertical(10); var lc2 = new LineConstruction(document) { Page = page }; lc2.SetHorizontal(50); var lc3 = new LineConstruction(document) { Page = page }; lc3.SetVertical(50); var lc4 = new LineConstruction(document) { Page = page }; lc4.SetHorizontal(10); var in1 = new IntersectionNode(document, lc1, lc2) { Page = page }; var in2 = new IntersectionNode(document, lc3, lc4) { Page = page };
var lp = new ParagraphText.TextRectangle.Point { X = in1.Coordinates.X, Y = in1.Coordinates.Y, Node = in1 }; var rp = new ParagraphText.TextRectangle.Point { X = in2.Coordinates.X, Y = in2.Coordinates.Y, Node = in2 }; var pr = new ParagraphText.TextRectangle { LeftPoint = lp, RightPoint = rp, Page = page };
var p1 = new ParagraphText.TextRectangle.Point { X = fn1.X.Value, Y = fn1.Y.Value }; var p2 = new ParagraphText.TextRectangle.Point { X = fn2.X.Value, Y = fn2.Y.Value };
var rect = new ParagraphText.TextRectangle(p1, p2, page, 0); txt.AddRectangle(rect); txt.InsertText("this is inserted paragraph text..."); txt.EndEdit();
document.EndChanges(); } } } [/CODE]
Однако, это будет не очень удобно использовать. Если я не ошибаюсь, ссылка на объект узла нужна для автоматической коррекции координат точек параграфа. Я попробовал также привязку к узлам типа [B]IntersectionNode[/B], чтобы проверить это.
Скрытый текст
[CODE] using TFlex; using TFlex.Model; using TFlex.Model.Model2D;
namespace Test { public class ParagraphBuilder { static readonly Document document = Application.ActiveDocument;
public static void Run() { if (document == null) return; var page = document.ActiveView.Page; if (page == null) return;
document.BeginChanges(""); var lc1 = new LineConstruction(document) { Page = page }; lc1.SetVertical(10); var lc2 = new LineConstruction(document) { Page = page }; lc2.SetHorizontal(50); var lc3 = new LineConstruction(document) { Page = page }; lc3.SetVertical(50); var lc4 = new LineConstruction(document) { Page = page }; lc4.SetHorizontal(10); var in1 = new IntersectionNode(document, lc1, lc2) { Page = page }; var in2 = new IntersectionNode(document, lc3, lc4) { Page = page };
var p1 = new ParagraphText.TextRectangle.Point { X = in1.Coordinates.X, Y = in1.Coordinates.Y, Node = in1 }; var p2 = new ParagraphText.TextRectangle.Point { X = in2.Coordinates.X, Y = in2.Coordinates.Y, Node = in2 };
var rect = new ParagraphText.TextRectangle(p1, p2, page, 0); txt.AddRectangle(rect); txt.InsertText("this is inserted paragraph text..."); txt.EndEdit();
document.EndChanges(); } } } [/CODE]
[S]Но, к сожалению, результат оказался еще хуже. Проблема в том, что координаты узлов по нулям (см. вложение).[/S]
[S]В общем, как временное решение, используйте глобальные переменные для синхронизации координат узлов и точек привязки параграфа.[/S]
[QUOTE]Игорь написал: Добрый день, подскажите как можно получить программно документ или фрагмент для выделенного фэйса или другого элемента?[/QUOTE] [CODE] void PluginInstance::ObjectSelectionChangedEventHandler(ObjectEventArgs^ args) { ModelObject ^obj = args->Object; Fragment3D^ fr3d = nullptr;
if (obj->GroupType == ObjectType::Topol) { TopolReference^ topol = (TopolReference^)obj;
for each (ParentObject ^p in topol->Parents) { fr3d = (Fragment3D^)p->Object; if (fr3d != nullptr) break; } }