Обнаружена ошибка 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
Такое случается из-за несовместимости API с приложением. Я обновил архив с бинарными файлами. Скачайте обновленную сборку приложения по той же ссылке...
Примечание 1. В Open T-FLEX CAD API добавлено много функций. В частности, некоторые из них затрагивают API, связанные с классом ExportToPDF. Текущее обновление просто повышает версию API без надлежащего анализа и тестирования. 2. Минимальная поддерживаемая версия T-FLEX CAD API 17.1.0.0
Hydra, зависание возникает при запуске отладчика непосредственно в редакторе макросов... эта ошибка уже давно наблюдается (не помню точно с какой версии)...
ainis написал: Можно ли с помощью API для конфигураций модели изменить набор значений переменных?
Странный вопрос. Конфигурации -- это набор состояний общих геометрических данных. Конфигурации применяются на уровне сборки с тем состоянием, которое вы определили в документе фрагмента (текущая конфигурация). Как я понял, вы хотите изменить состояние переменных текущей конфигурации при включении в сборку... только не понятно зачем так усложнять?! Если вам нужны динамические фрагменты, на мой взгляд, конфигурации не лучший вариант для этого. Возможно, стоит рассмотреть вариант создания адаптивных фрагментов с пользовательскими данными в составе изделия (нужно проверять).
Sasha написал: А почему если на проекции есть линии, круги и т.п. такая проблема разрушить проекцию?
В T-FLEX CAD 17 проекция создается на основе нового типа страницы "Проекция". По умолчанию этот тип страницы скрыт. Чтобы отобразить этот тип на вкладке, нужно установить галку в диалоге "Страницы" (см. раздел: Страницы документа). Насколько я понимаю, новый тип страницы "Проекция" выполняет ту же роль, что и тип страницы "Вспомогательная" для чертежного вида, только для проекций (к сожалению, в справочнике не так много информации). Возможно, то что вам нужно, уже реализовано...
ainis написал: Можно ли как-то получить TFlex.Model.Document?
Нет, этот API предоставляет независимую объектную модель (ограниченную в плане управления документом). По сути, компонент TFlex.CAD.Server.DLL обеспечивает доступ к серверной части T-FLEX CAD для работы с документом в асинхронном режиме. В отличии от приложения, построенного на базе TFlexAPI.DLL, серверный компонент позволяет обрабатывать запросы от нескольких клиентов одновременно. То есть, принципиальное отличие в том, что документ не блокируется на запись, если он (документ) уже открыт по запросу другого клиента.
ainis написал: У меня почему-то для всех составов это свойство - False.
Я уже писал об этом ранее,
Цитата
класс "ProductStructure" содержит свойство "IsShownInProductStructureWindow", но оно будет работать только при открытом окне "Состав изделия"
Нужно писать в техподдержку по этому вопросу. Скорее всего это баг API. --- Ещё в API есть статический метод ProductStructure.GetActiveProductStructure, который, по идее, должен возвращать ссылку на объект ProductStructure, но к сожалению и тут засада... метод всегда возвращает null...
Оказывается проблема не в координатах, это связано с привязкой к узлам. Я создал вручную параграф (см. граф зависимостей: tflexcad-paragraph-info-1.PNG) и сравнил с результатом, полученным при выполнении макроса (см. граф зависимостей: tflexcad-paragraph-info-2.PNG). На втором снимке видно, что отсутствует "Узел 2". Что характерно, в T-FLEX CAD 12 то же самое... Чтобы получить координаты узлов, нужно отделить операцию создания узлов от операции создания параграфа.
Код
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 };
document.EndChanges();
document.BeginChanges("Create Paragraph");
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
};
ParagraphText txt = new ParagraphText(document)
{
HeightAction = ParagraphText.FitHeightAction.Ignore,
WidthAction = ParagraphText.FitWidthAction.Ignore
};
txt.AddRectangle(pr);
txt.BeginEdit();
txt.InsertParagraph();
txt.InsertText("this is inserted paragraph text...");
txt.EndEdit();
document.EndChanges();
}
}
}
Nikita, по видимому опять что то в API сломали... Если убрать ссылку на объект узла, то параграф создается по заданным координатам.
Скрытый текст
Код
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 fn1 = new FreeNode(document, 10, 50) { Page = page };
var fn2 = new FreeNode(document, 50, 10) { Page = page };
ParagraphText txt = new ParagraphText(document)
{
HeightAction = ParagraphText.FitHeightAction.Ignore,
WidthAction = ParagraphText.FitWidthAction.Ignore
};
txt.BeginEdit();
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();
}
}
}
Однако, это будет не очень удобно использовать. Если я не ошибаюсь, ссылка на объект узла нужна для автоматической коррекции координат точек параграфа. Я попробовал также привязку к узлам типа IntersectionNode, чтобы проверить это.
Скрытый текст
Код
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 };
ParagraphText txt = new ParagraphText(document)
{
HeightAction = ParagraphText.FitHeightAction.Ignore,
WidthAction = ParagraphText.FitWidthAction.Ignore
};
txt.BeginEdit();
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();
}
}
}
Но, к сожалению, результат оказался еще хуже. Проблема в том, что координаты узлов по нулям (см. вложение).
В общем, как временное решение, используйте глобальные переменные для синхронизации координат узлов и точек привязки параграфа.