Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Параграф текст заданный на двух узлах
 
Добрый день. Необходимо построить параграф текст привязанный к двум узлам. Для решения данной задачи был написан код, показанный ниже. В результате после запуска макроса, создаются узлы и рядом с ними параграф текст, который не привязан к этим самым узлам. Созданный параграф текст по данному коду, отображается рядом с узлами и "слит" в одну точку. Подскажите как должен выглядеть код, чтобы параграф текст был привязан к условным узлам fn1 и fn2?
Код
using System;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
public class NewMacroClass
{
public static void NewMacro()
{
        Document document = TFlex.Application.ActiveDocument;  
        document.BeginChanges("");
        FreeNode fn1 = new FreeNode(document, 10, 50);
        FreeNode fn2 = new FreeNode(document, 50, 10);
        Page page = document.ActivePage;
        ParagraphText txt = new ParagraphText(document);
        txt.BeginEdit();
        ParagraphText.TextRectangle.Point Point1 = new ParagraphText.TextRectangle.Point(10,50,fn1);
        ParagraphText.TextRectangle.Point Point2 = new ParagraphText.TextRectangle.Point(50,10,fn2);
        ParagraphText.TextRectangle rect = new ParagraphText.TextRectangle(Point1,Point2,page,0);
        txt.AddRectangle(rect);
        txt.EndEdit();
        document.EndChanges();
}
}
}
 
Nikita, по видимому опять что то в API сломали... :-)
Если убрать ссылку на объект узла, то параграф создается по заданным координатам.
Скрытый текст

Однако, это будет не очень удобно использовать. Если я не ошибаюсь, ссылка на объект узла нужна для автоматической коррекции координат точек параграфа.
Я попробовал также привязку к узлам типа IntersectionNode, чтобы проверить это.
Скрытый текст

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

В общем, как временное решение, используйте глобальные переменные для синхронизации координат узлов и точек привязки параграфа.
Изменено: vite - 09.03.2023 17:13:42
T-FLEX CAD 17.1.6.0
 
vite, спасибо, что откликнулись и провели анализ моей проблемы. Я испробовал составленный вами код:
Код
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();
        }
    }
}
После срабатывания кода, на странице появляется параграф текст "наложенный на узлы" (точки параграф текста совпадают с узлами), - параграф текст не привязан к узлам. Если перемещать узлы, то точки параграф текста остаются на месте.
 
Оказывается проблема не в координатах, это связано с привязкой к узлам. Я создал вручную параграф (см. граф зависимостей: 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();
        }
    }
}
T-FLEX CAD 17.1.6.0
 
Достаточно применить "между" ними метод ApplyChanges()
Страницы: 1