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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 3 4 5 6 7 След.
Вопрос по API
 
Подскажите, пжалста, можно ли с помощью макроса программно вставить в сборку 3D-фрагмент из DOCs (важно!)? Почитал хэлп по API, нашел только методы, которые вставляют фрагменты по пути к файлу, т.е. фрагменты с диска.
 
Неужели никто не знает как это сделать ????
В хелпе по кадовскому API нашел только коструктор класса Fragment3D, который вставляет фрагмент с диска. Можно было бы, конечно, скопировать файл из хранилища DOCs на диск, а потом вставить в сборку, но мне кажется должен быть более простой способ это сделать. Подскажите, пжалста, если что-то об этом знаете. Позарез нужно.
 
попробуйте посмотреть API Docs
 
Кто может написать макрос для tf,который подсчитает и пронумерует по-порядку вхождение в многостраничный документ заданного текстового признака?
Это нужно для организации нумерации листов многостраничного документа,а так же решения прочих подобных задачь,например нумерации технологических операций по порядку.
 
Сформулируйте более подробно задачу
 
В TF нет автоматизации расстановки номеров листов многостраничного документа (как в Word'е). По-крайней мере сам не нашёл и на форуме никто не подсказал.

Разработал мини-САПР, представляющая собой набор технологических карт-шаблонов (тит. лист, 1-й и последующие листы маршрутных и прочих карт...). Каждая карта находится на отдельной странице TF. Всё хорошо работает, ввёл заполнение необходимых полей через параметры, в одном документе и модель, и чертёж, и технология, и база технологических операций, и прочее. Всё работает быстро, стабильно. Но так и не реализовал автоматизированную сквозную нумерацию листов и приходится это делать вручную :(, что при числе листов порядка 50-100 вызывает НЕКОТОРЫЕ неудобства.

Так вот, проблему наметил решить следующим образом: в каждой карте-шаблоне в соответствующем поле намереваюсь ввести текстовую строку, например #Листа. После окончания инженерных работ пользователь запускает некий макрос, который определит во всём многостраничном документе вхождение поля #Листа и заменит эти поля числовым значением по порядку (как в Word'е "Найти и заменить...", только вместо фиксированного значения заменяющего параметра, должны быть вставлены значения 1, 2, 3, ...).

Аналогично с нумерацией операций. Имеется база текстовых шаблонов операций, вместо конкретного номера которых предполагается ввести некоторое поле, например #Опер. Макрос должен найти вхождения этих полей и заменить их соответствующими значениями операций по-порядку (000, 005, 010, ...). Тексты операций следуют одна-за-другой в текстовом окне, созданного при помощи Создать текст/Создать параграф-тект.

Для меня такая задача неразрешима, хотя уверен, что ничего сложного для практикующего программиста в этом нет.
 
Все это у Вас в одном файле ?
 
На самом деле можно обойтись и без макросов. Я как-то делал автонумерацию и получение количества страниц всего документа, вот только работало это плохо. При редактировании страниц, не происходило динамического пересчета документа(эту проблему я затронул в теме http://tflex.ru/vhodnaforum/read.php?FID=2&TID=978&MID=7420#message7420). При удалении какой-либо страницы номера других страниц не менялись. Помогал только "ручной" запуск пересчета. Хотя, в Вашем случае это наверно не кретично.

В форматках(прототипах) создайте вещественную переменную напр. list и назначте на нее функцию GETV("APAGE", 0), потом введите эту переменную в графу "Лист" вместо $list и вуаля... Для получения количества всех листов нужно воспользоваться функцией GETV("APAGES", 0).
Кто ищет - тот всегда найдет!
 
Функции setv() и getv()
Top



В системе T-FLEX CAD определены несколько глобальных параметров, которые влияют на отображение чертежа на экране. Такими параметрами являются:

SCALE - масштаб чертежа.

XL - координата X левой границы чертежа.

XH - координата X правой границы чертежа.

YL- координата Y нижней границы чертежа.

YH - координата Y верхней границы чертежа

_XL - координата X левой границы сборочного чертежа при использовании текущего чертежа в качестве фрагмента.

_XH - координата X правой границы сборочного чертежа при использовании текущего чертежа в качестве фрагмента.

_YL - координата Y нижней границы сборочного чертежа при использовании текущего чертежа в качестве фрагмента.

_YH - координата Y верхней границы сборочного чертежа при использовании текущего чертежа в качестве фрагмента.

FSIZE - размер шрифта чертежа.

LTHICK - толщина основных линий чертежа.

TLTHICK - толщина тонких линий документе

EXPLODE - режим разборки фрагментов чертежа.

Следующая группа параметров позволяет производить нумерацию страниц в форматках многостраничного документа или спецификации.

APAGES - возвращает общее количество страниц, в документе, в который включен данный фрагмент

APAGE - возвращает номер страницы, на которую нанесен данный фрагмент

BOMPAGES - возвращает общее количество страниц в спецификации в документе, в который включен данный фрагмент

BOMPAGE - возвращает номер страницы спецификации, на которую нанесен данный фрагмент



Для трёхмерных моделей предусмотены следующие глобальные параметры:

getv("mass",0) - значение массы всех тел в сцене;

getv("volume",0) - значение объёма всех тел в сцене;

getv("area",0) - значение площади поверхности всех тел в сцене;



В функции setv параметры _XL, _XH, _YL, _YH, EXPLODE, APAGES, APAGE, BOMPAGES, BOMPAGE не используются.

Количество зарезервированных параметров системы может изменяться. Все дополнения и изменения указываются либо в файле READ.ME, либо в Help - функции.



Кроме этих параметров вы можете создать свои глобальные параметры.

Функции setv() и getv() позволяют в редакторе переменных соответственно устанавливать и получать значения глобальных параметров.



Функции setv() и getv() могут получать и устанавливать значения параметров, задаваемых в команде "ST - Статус" любой страницы. Для этого необходимо при вызове этой функции сформировать имя первого операнда из старого имени (их список приведён выше), знака подчёркивания и имени страницы. Например, для получения масштаба второй страницы, необходимо вызвать функцию

getv("SCALE_Страница 2",0)



Синтаксис функций:

getv("NAME",N)

Этот вызов означает: получить значение глобального параметра системы, где NAME - имя глобального параметра, N - значение, которое вернет функция, если не найдет указанного параметра.

Вы можете получить значение любого параметра чертежа, установленного функцией setv().

setv("NAME",M)

Этот вызов означает: установить значение глобального параметра системы, где NAME - имя глобального параметра, M - значение, которое будет установлено для указанного параметра. В качестве M может использоваться переменная или выражение.

Если вы зададите новое имя, то система создаст для текущего чертежа новый глобальный параметр. Глобальные параметры могут использоваться при передаче значений между сборочным чертежоми его составными частями (фрагментами).



Например, в сборочном чертеже вы с помощью функции

setv ("TMP", 50)

создаете глобальную переменную TMP со значением 50, а во фрагментах с помощью функции

getv ("TMP", 0)

получаете значение глобальной переменной TMP равное 50.



Смотри: Функции работы с переменными


PS: ОПС опередили
 
Освещу суть проблеммы.
Технология состоит из большого количества типов карт:
1 - Титульный лист,
2 - Маршрутная карта. Лист-1,
3 - Маршрутная карта. Лист-2,
4 - Операционная карта. Лист-1,
5 - Операционная карта. Лист-2,
6 - Карта технического контроля.Лист-1,
..........
N - Лист регистрации изменений.
Извещение о вводе документа.

Другими словами имеется набор большого кол-ва шаблонов форматок, которые вставлены на страницы как фрагменты.

Так вот.

APAGES - возвращает общее количество страниц, в документе, в который включен данный ФРАГМЕНТ

APAGE - возвращает номер страницы, на которую нанесен данный ФРАГМЕНТ

Да, функции setv() и getv() работают, но в моём случае они не подходят, так как подсчитывают и нумеруют именно вхождения ФРАГМЕНТА, т.е. для Листа 1 (Титульный) вернёт 1, для Листа 2 - 1, для Листа 3 - 1, для Листа 4 - 2, ...

С номерами операций - совсем тёмный лес :)
 
Александр. Думаю Вы не правы. Я проверял в T-Flex 7 и T-Flex 10. Функция GETV("APAGE", 0) возвращает именно номер страницы в соответствии с ее порядковым номером в окне "Страницы", а GETV("APAGES", 0) - число всех страниц, включая пустые. С номерами операций, к сожалению, помочь не смогу, так как сам только планирую изучать API. Через окно параметров только промучаетесь.
Кто ищет - тот всегда найдет!
 
Ой, то есть через редактор переменных :))
Кто ищет - тот всегда найдет!
 
Александр огласите всеь список ваших проблем. ;)
В вашем случае я думаю карты лучше раскидать по разным файлам (ТЛ,МК,ВО,...)
а комплект документов делать как сборку

PS: Может Вам лучше использовать T-FLEX Технологию ;)
 
to Brom25 & roand

На самом деле GETV("APAGE", 0) возвращает то что нужно :) ! И как это я проморгал, когда впервый раз пытался её использовать? Ну да ладно, заблуждения развеяны, за что Вам искреннее спасибо!

Осталась проблемма нумерации операций.

Цитата
roand пишет:

Александр огласите всеь список ваших проблем. В вашем случае я думаю карты лучше раскидать по разным файлам (ТЛ,МК,ВО,...)а комплект документов делать как сборку

PS: Может Вам лучше использовать T-FLEX Технологию

Неа, раскидывать не стоит. Документ сразу берёт своей цельностью.

TF Технология - это что-то для нас заоблачное. Предприятие работает на продуктах Аскона (Вертикаль внедряется). А я сколько не пытался работать в Компасе, столько раз и плевался, хотя и способен неплохо в нём ваять...
 
В T-Flex существует один очень интересный инструмент, позволяющий автоматически нумеровать, например, строки спецификции, производить сравнение в строках по заданному признаку и если они одинаковы производить их «суммирование»… Инструмент довольно сложный, но это лучшее, что я могу Вам предложить как альтернативу макросам. Рассмотрите внимательно как сделана форматка Х\T-FLEX\T-FLEX CAD 9\Program\Прототипы\Спецификации\Спецификация форма 1 ГОСТ 2.106-96.grb, либо запустить Сервис>Спецификация>Новая. Если Вы сумеете переделать этот инструмент под себя, думаю, окажетесь «На коне». Сам только 1,5 недели назад изучать начал, но пришел в некоторый восторг! :) Желаю успехов!
Кто ищет - тот всегда найдет!
 
Пытаюсь переменным фрагмента через API присваивать константные значения, либо ссылки на переменные сборочного чертежа – не выходит.

Часть кода программы:
Цитата

foreach(Fragment fr in document.Fragments)
{
Document doc = fr.GetFragmentDocument(true);
fr.SetDefaultVariableValues();
doc.BeginChanges("Проверка");
foreach(Variable var in doc.Variables)
{
if (var.External == true)
if (var.Name == "$n_contr")
{
var.Expression = ""Иванов"";
}
}
doc.EndChanges();

Здесь fr.GetFragmentDocument(false) – получить документ фрагмента с подстановкой значений переменных фрагмента;
fr.SetDefaultVariableValues() - установить значения переменных фрагмента из документа фрагмента.
Выполнение любого из этих методов не приводит к установке значений переменных фрагмента к изначальным (установленным в файле фрагмента).
Попытка присвоить переменной фрагмента явное значение (var.Expression = "\"Иванов\"";) так же не увенчалась успехом :( При компиляции сообщений об ошибках нет.

Может быть кто-то знает, что я делаю не так?
Кто ищет - тот всегда найдет!
 
Я знаю, что не так. Вы меняете (пытаетесь менять) внуренние переменные документа фрагмента. А нужно менять переменные ЭКЗЕМПЛЯРА фрагмента в сборочном документе. Это нужно делать примерно так:

using System;
using TFlex;
using TFlex.Model;
using TFlex.Model.Model2D;

namespace NewMacroNamespace
{
public class NewMacroClass
{
public static void NewMacro()
{
Document doc = Application.ActiveDocument;
foreach(Fragment fr in doc.Fragments)
{
doc.BeginChanges("Проверка");
fr.SetDefaultVariableValues();
FragmentVariableValues vars = fr.VariableValues;
foreach(FragmentVariableValue var in vars)
{
if(var.Name == "d")
{
var.RealValue = 30;
}
if(var.Name == "$pole")
{
var.TextValue = "Иванов";
}
}
}
doc.EndChanges();
}
}
}
 
TFUser.


ОГРОМНОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!


У меня даже получилось подставить значением переменной фрагмента переменную сборки :)
Кто ищет - тот всегда найдет!
 
Помогите пожалуйста разобраться как работать с абстрактными классами. Мне нужно получить доступ к текстам (ParagraphText, MultilineText, LineText). Пробовал конструкцию:
foreach(ParagraphText p_txt in document.Texts)
{
}
но она работает лишь в том случае, если в документе нет текстов отличных от ParagraphText. Пробовал также такую конструкцию(для простоты выбрал LineText):
foreach(Text txt in document.Texts)//класс Text – абстрактный класс
if (txt.SubType==TextType.LineText)
{
txt.Angle = 83;// Angle - свойство определенное для LineText
}
система выдает ошибку. Я понимаю, что в блоке нужно каким-то образом переопределить txt для работы с LineText, а вот как – не знаю.

Помогите пожалуйста.
Кто ищет - тот всегда найдет!
 
Нашееел!!!

Нужно делать так:

foreach(Text txt in document.Texts)
if (txt.SubType==TextType.LineText)
{
LineText L_txt = txt as LineText;
L_txt.Angle = 83;
}

И в общем дело не в абстрактных классах. :)
Кто ищет - тот всегда найдет!
Страницы: 1 2 3 4 5 6 7 След.