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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Удаление ссылки на файл
 
Всем привет. Как можно удалить ссылку на файл (FileLink). Через DeleteObjects не получается т.к. FileLink не наследуется от Model. Очень нужна такая возможность API
 
Цитата
Паша Маргинал написал:
Как можно удалить ссылку на файл (FileLink).
если вы обратили внимание, интерфейс окна "Ссылки" не поддерживает функцию удаления ссылок. но, можно удалить фрагмент, а затем обновить ссылки.
Изменено: Vite - 21.06.2017 15:12:48
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
Как можно удалить ссылку на файл (FileLink).
если вы обратили внимание, интерейс окна "Ссылки" не поддерживает функцию удаления ссылок. но, можно удалить фрагмент, а затем обновить ссылки.
То есть если я перед удалением фрагмента скопирую сам фрагмент, удалю его, обновлю ссылки и вставлю копию то должно сработать? Тогда вопрос фрагмент скопируется с ссылкой или без? Вообще по API не понятно привязывается ссылка к фрагменту, или есть общий контейнер ссылок, где для ссылки указывается фрагмент
 
Цитата
Паша Маргинал написал:
То есть если я перед удалением фрагмента скопирую сам фрагмент, удалю его, обновлю ссылки и вставлю копию то должно сработать?
Зачем так усложнять? Можно переопределить свойство "FilePath". Фрагменты легко заменяются на уровне переременных документа (см. вложение). Если путь фрагмента определен переменной документа, то ссылки обновлять не нужно, достаточно обновить модель. Таким же образом, можно погасить фрагмент, без удаления.

Код
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace Test
{
    public class Class11
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;

            if (document != null)
            {
                document.BeginChanges("");

                foreach (FileLink link in document.FileLinks)
                {
                    if (link.IsOriginalFormat)
                    {
                        ReplaceFragment(document, "Part1.grb", "Part2.grb");
                        //RemoveFragment(document, "Part1.grb");
                        break;
                    }
                }

                document.EndChanges();
            }
        }

        static bool ReplaceFragment(Document document, string filePathOld, string filePathNew)
        {
            foreach (Fragment fragment in document.GetFragments())
            {
                if (fragment.FilePath == filePathOld)
                {
                    fragment.FilePath = filePathNew;

                    if (fragment.GroupType == ObjectType.Fragment3D)
                        document.Regenerate3D();
                    return true;
                }
            }
            return false;
        }

        static bool RemoveFragment(Document document, string filePath)
        {
            ObjectArray objArray = new ObjectArray();
            DeleteOptions deleteOptions = new DeleteOptions();

            foreach (Fragment fragment in document.GetFragments())
            {
                if (fragment.FilePath == filePath)
                {
                    objArray.Add(fragment);

                    document.DeleteObjects(objArray, deleteOptions);
                    return true;
                }
            }
            return false;
        }
    }
}
Изменено: Vite - 21.06.2017 14:56:32
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
То есть если я перед удалением фрагмента скопирую сам фрагмент, удалю его, обновлю ссылки и вставлю копию то должно сработать?
Зачем так усложнять? Можно переопределить свойство "FilePath". Фрагменты легко заменяются на уровне переременных документа (см. вложение). Если путь фрагмента определен переменной документа, то ссылки обновлять не нужно, достаточно обновить модель. Таким же образом, можно погасить фрагмент, без удаления.
Код
 
Спасибо большое за пример! У меня остался последний вопрос: может ли быть у фрагмента несколько ссылок? Если да, то каким образом это сделать через API? Присваивая разные индексы не получается
 
Цитата
Паша Маргинал написал:
может ли быть у фрагмента несколько ссылок?
что значит несколько ссылок? путь фрагмента определяется свойством "FilePath", и на уровне пользовательского интерфейса можно задать путь через переменную документа в формате: {$Path}
переменная документа, это универсальный объект, который можно очень просто преобразовать в коллекцию (выпадающий список), подключить к таблице базы данных.
Изменено: Vite - 21.06.2017 15:28:36
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
может ли быть у фрагмента несколько ссылок?
что значит несколько ссылок? путь фрагмента определяется свойством "FilePath", и на уровне пользовательского интерфейса можно задать путь через переменную документа в формате: {$Path}
переменная документа, это универсальный объект, который можно очень просто преобразовать в коллекцию (выпадающий список), подключить к таблице базы данных.
Я имею в виду object.SetFileLinkReference(). Такой конструкцией я могу привязать ссылку к файлу (например текстовому). Функция принимает int id и саму ссылку FileLink. Но если я делаю допустим для фрагмента object.SetFileLinkReference( i, new FileLink()) в цикле от 0 до 10, то проставится только последняя ссылка т.е. к фрагменту привязана будет только одна ссылка, а все остальные от 0 до 9 неизвестно куда пропадают. Я хочу проставить для фрагмента несколько ссылок
 
Цитата
Паша Маргинал написал:
Я хочу проставить для фрагмента несколько ссылок
когда создается новый документ, по-умолчанию, в нем всего две ссылки, которые определены в параметрах документа (см. вложение). если добавить фрагмент, то ссылка на файл создается автоматически при включении из библиотеки или локальной директории. объясните, что конкретно вы хотите сделать?
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
Я хочу проставить для фрагмента несколько ссылок
когда создается новый документ, по-умолчанию, в нем всего две ссылки, которые определены в параметрах документа (см. вложение). если добавить фрагмент, то ссылка на файл создается автоматически при включении из библиотеки или локальной директории. объясните, что конкретно вы хотите сделать?
Я хочу найти определенное текстовое поле (ParagraphText) с определенным текстом внутри. Для этого текста я хочу проставить несколько ссылок на внешний файл через ParagraphText.SetFileLinkReference()
 
Цитата
Паша Маргинал написал:
Для этого текста я хочу проставить несколько ссылок на внешний файл через ParagraphText.SetFileLinkReference()

Код
FileLink link = new FileLink(document, "test.lst");

foreach (ParagraphText text in document.GetTexts())
{
    text.BeginEdit();

    if (text.TextValue.Contains("Параграф"))
        text.SetFileLinkReference(link.InternalID.ToInt32(), link);

    text.EndEdit();
}


если не секрет, зачем это вам понадобилось?
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
Код
 


если не секрет, зачем это вам понадобилось?
Судя по вашему коду, для одного экземпляра ParagraphText проставится только один FileLink, а мне нужно именно несколько FileLink для одного параграфа. Мне это нужно для того, чтобы в тексте искать некие совпадения с регуляркой и проставлять на этот параграф ссылки на внешний файл, который через некоторые хитрости будет открывать браузер с запросом. Если в одном параграфе я нахожу больше 1-ого совпадения, то соответственно хотелось бы на параграф ставить несколько ссылок
 
Цитата
Паша Маргинал написал:
Судя по вашему коду, для одного экземпляра ParagraphText проставится только один FileLink, а мне нужно именно несколько FileLink для одного параграфа.
вы можете прикрепить к объекту "ParagraphText" сколько угодно ссылок, с этим нет проблем:
Код
FileLink link = null;

foreach (ParagraphText text in document.GetTexts())
{
    text.BeginEdit();

    if (text.TextValue.Contains("Text1"))
    {
        link = new FileLink(document, "item1.txt");
        text.SetFileLinkReference(link.InternalID.ToInt32(), link);
    }
    if (text.TextValue.Contains("Text2"))
    {
        link = new FileLink(document, "item2.txt");
        text.SetFileLinkReference(link.InternalID.ToInt32(), link);
    }

    text.EndEdit();
}
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
Паша Маргинал написал:
Судя по вашему коду, для одного экземпляра ParagraphText проставится только один FileLink, а мне нужно именно несколько FileLink для одного параграфа.
вы можете прикрепить к объекту "ParagraphText" сколько угодно ссылок, с этим нет проблем:
Код
 
 
Огромное спасибо! Осталась ещё одна проблема - в какой-то момент мне надо удалять все ссылки с конкретного параграфа. Можно ли как то достать все ссылки из одного параграфа?
 
Цитата
Паша Маргинал написал:
Можно ли как то достать все ссылки из одного параграфа?

Код
static bool RemoveFileLink(Document document, ParagraphText text, string filePath)
{
    foreach (FileLink link in document.FileLinks)
    {
        if (link.FilePath == filePath)
        {
            text.SetFileLinkReference(link.InternalID.ToInt32(), new FileLink(document));
            return true;
        }
    }
    return false;
}
T-FLEX CAD 17.1.6.0
 
Вы меня сильно выручили, спасибо большое!
Страницы: 1