Изменение полей (fields)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Изменение полей (fields)

Изменение полей (fields)

Ответ
Поиск в этой теме
Непрочитано 31.01.2007, 12:31 #1
Изменение полей (fields)
RomanM
 
инженер
 
Москва
Регистрация: 25.04.2006
Сообщений: 1,207

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

У меня задача стоит такая: нужно в значение поля поместить имя файла без расширения (это понятно как) и нескольких последних символов.
Например:
имя файла: "ПЛАН23.DWG"
в поле должно отражаться: "ПЛАН"

Или, еще лучше, в значение поля поместить имя папки, в которой находится файл, но не всего пути.
Например:
путь к файлу: "С:\Кат1\Кат2\ПЛАН23.DWG"
в поле должно отражаться: "Кат2".

Заранее благодарен за ответ.
Просмотров: 13701
 
Непрочитано 31.01.2007, 23:06
#2
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Боюсь, что безнадега. В формуле поля вполне жестко и однозначно указывается, что суждено нам увидеть. Такие варианты там недоступны.
__________________
Number
TextDuplicate
FieldToText
den001 вне форума  
 
Непрочитано 01.02.2007, 08:34
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Можно, конечно, попробовать RTEXT из ET, только я в дизеле не очень
Да и автоматического обновления ждать не придется
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.02.2007, 09:32
#4
master_vlad


 
Регистрация: 19.03.2004
Сообщений: 172


$(strlen, string) - вычисление длины сторки

$(substr, string, start [, length]) - возвращает подстроку с указанного знака, и указанной длинны
$(+, val1 [, val2, ..., val9]) - сложение
$(–, val1 [, val2 , ..., val9]) - вычитание

%<\AcVar Filename \f "%fn7">% - поле Filenamе

приняв поле Filenamе за string вы можете вырезать из него подстроки интересующей длины
master_vlad вне форума  
 
Автор темы   Непрочитано 01.02.2007, 13:10
#5
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Получилось. Спасибо.
RomanM вне форума  
 
Непрочитано 15.02.2007, 10:58
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


А как получилось то, у меня не получилось.
Делал так:
%<\AcVar $(substr,Filename,2,2) \f "%fn6">%
и еще много как.
Sleekka вне форума  
 
Автор темы   Непрочитано 22.02.2007, 00:01
#7
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
А как получилось то, у меня не получилось.
Делал так:
%<\AcVar $(substr,Filename,2,2) \f "%fn6">%
и еще много как.
Например вот так:

%<\AcDiesel $(substr,%<\AcVar Filename \f "%fn2">%, 1, $(-, $(strlen, %<\AcVar Filename \f "%fn2">%), 4))>%

Возвращает имя файла без нескольких символов на конце.
RomanM вне форума  
 
Автор темы   Непрочитано 20.04.2007, 15:40
#8
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Поля модифицированные вышеуказанным способом и поля с датами автоматически не обновляются.
Можно ли их как-нибудь заставить это делать?
(FIELDEVAL и UPDATEFIELD в данном случае не подходят)
RomanM вне форума  
 
Непрочитано 23.04.2007, 19:44
#9
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


REGENALL ???
__________________
Сквозь тернии к звездам.... и обратно :yes:
Startrek вне форума  
 
Непрочитано 23.04.2007, 21:10
#10
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
REGENALL ???
да нет тут речь не о том.
RomanM, как говорят ацы, поля можно сделать новые свои, для этого нужно знать ObjectARX. Больше никак, все ети танцы с дизелем это все равно что с вилами на танк.
Sleekka вне форума  
 
Автор темы   Непрочитано 23.04.2007, 22:12
#11
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
Цитата:
REGENALL ???
да нет тут речь не о том.
RomanM, как говорят ацы, поля можно сделать новые свои, для этого нужно знать ObjectARX. Больше никак, все ети танцы с дизелем это все равно что с вилами на танк.
Странно :?

основная задача решена - поля можно модифицировать не только в рамках стандартных модификаторов.

До идеала один шаг - автоматическое их обновление. То есть все превосходно работает, но только если выделяешь поле и нажимаешь кнопочку обновить - все замечательно обновляется.
Неужели нельзя добавить последний штрих: изменить значение какой-нибудь там системной переменной, чтобы эти поля апдатились при той же REGENALL.
RomanM вне форума  
 
Непрочитано 23.04.2007, 22:37
#12
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


пипец тыж сам писал FIELDEVAL=31 и уперед, тока внутри дизеля поле вычисляется один раз и все.
Sleekka вне форума  
 
Автор темы   Непрочитано 24.04.2007, 07:47
#13
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
пипец тыж сам писал FIELDEVAL=31 и уперед, тока внутри дизеля поле вычисляется один раз и все.
ОК.

Обыкновенное поле с датой можно автоматически обновлять?
RomanM вне форума  
 
Непрочитано 24.04.2007, 21:14
#14
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Да.
Sleekka вне форума  
 
Автор темы   Непрочитано 25.04.2007, 10:36
#15
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
Да.
КАК?
RomanM вне форума  
 
Непрочитано 25.04.2007, 23:10
#16
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Я примерно начинаю понимать откуда ростут ноги у подбных вопросов. Что ты понимаешь под словом автоматическое?
если предположить что с FIELDEVAL=31 ты знаком и обновление по save или regen не устраивает, тогда поедем дальше:
На компьютере ничего не происходит само собой, на все вычисления, которые нужно произвести нужна либо команда (тобеж действия пользователя) либо реакция на случившееся событие.
Если нужно обновление полей в стиле отредактировал текст у которого внутри поле и все изменилось, то нужно нанять программиста который напишет реактор на все команды редактирования ddedit, и т. д.
НО!!! обновление полей дело не очень быстрое, как например пересчет простеньких листов в екселе, то такая фича может вызвать у пользователя ощущения тормозов. Пользователи будут начинать колотить по Esc, правой и левой кнопкам мыши, причем они это делают так быстро и так часто (я просто диву даюсь их неумной энергии).
ИМХО: я лично принципиально против реакторов, это отнимает минимальное понимание у пользователя происходящих процессов.
Надеюсь ответ был исчерпывающим, подробнее в книжках например Полещука.
Sleekka вне форума  
 
Автор темы   Непрочитано 26.04.2007, 10:09
#17
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
Я примерно начинаю понимать откуда ростут ноги у подбных вопросов. Что ты понимаешь под словом автоматическое?
если предположить что с FIELDEVAL=31 ты знаком и обновление по save или regen не устраивает, тогда поедем дальше:
На компьютере ничего не происходит само собой, на все вычисления, которые нужно произвести нужна либо команда (тобеж действия пользователя) либо реакция на случившееся событие.
Если нужно обновление полей в стиле отредактировал текст у которого внутри поле и все изменилось, то нужно нанять программиста который напишет реактор на все команды редактирования ddedit, и т. д.
НО!!! обновление полей дело не очень быстрое, как например пересчет простеньких листов в екселе, то такая фича может вызвать у пользователя ощущения тормозов. Пользователи будут начинать колотить по Esc, правой и левой кнопкам мыши, причем они это делают так быстро и так часто (я просто диву даюсь их неумной энергии).
ИМХО: я лично принципиально против реакторов, это отнимает минимальное понимание у пользователя происходящих процессов.
Надеюсь ответ был исчерпывающим, подробнее в книжках например Полещука.

Спасибо конечно за столь подробную лекцию, но мой вопрос куда более простой.

Поля с датой автоматически (при regen, open, save и т.д. - любой вариант мне подходит) не обновляются даже при fieldeval=31 - для обновления полей с датой предусмотрена команда UPDATEFIELD.

Но меня это несколько не устраивает поскольку рассматриваемое поле ставится в штампах чертежей с которыми работает много народу и говорить каждому что-то вроде: это поле ты обнови командой regen, это командой UPDATEFIELD, а это через контекстное меню, да еще не забудь переменную fieldeval правильно выставить... не реально.

Поэтому и спрашиваю: можно ли автоматически?
RomanM вне форума  
 
Непрочитано 26.04.2007, 21:12
#18
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Мда... не знал, что поля с датой такие вредные.
Ну да ладно все равно
Код:
- так выглядит стандартный макрос, на кнопку плот и на менюшку плот.
А мы берем и подменяем его на вот такой
Код:
[Выделить все]
^C^C(vl-cmdf "_updatefield" (ssget "A") "");_plot;
Тожа самое с сайвом и регеном. Ну и соответственно все ето на компы юзьверей.
НО!!! грамотнее было бы сделать вот так:
Это статья из журнала AUGIWorld переводил я.
Цитата:
Управление командами при помощи AutoLisp

Автокад иногда может служить помехой при внедрении стандартов, но с некоторой помощью вы можете научить Автокад вести себя немножечко иначе. Автокад предлагает множество команд к которым пользователь имеет доступ, но проблема заключается в том, что иногда вы хотите получить результат определенного типа от команды, когда она используется, вызвана ли команда из выпадающего меню, кнопкой на панели, или набрана в командной строке. Это не всегда проще сделать через адаптацию, но вы можете использовать команду UNDEFINE чтобы переучить Автокад тому, как команда должна действовать в различных случаях.Переобучение Автокада команде называется переопределение команды. В этой статье, Я покажу вам как удалить определение команды и обеспечить выполнение адаптированной версии команды при помощи Автолиспа.
Что значит удалить определение команды?
Автокад нагружен большим числом команд, в последнее время я насчитывал намного больше 800 команд и, да – это много. Каждая из этих команд немного другая, и временами вам хочется изменить поведение стандартной команды в некоторой степени, которая незначительно отличается от ее идеального состояния или возможно вы просто нехотите чувствовать себя слабым звеном используя индивидуальные команды постоянно.Автокадовксая команда UNDEFINE позволяет вам сказать Автокаду «забудь» о команде на все время пока рисунок в котором опрделение команды было удалено остается открытым. Автокад будет проявлять такую «амнезию» только на короткий промежуток времени, если конечно вы не будете говорить программе забывать о команде каждый раз когда создается или открывается рисунок. Команда UNDEFINE имеет один запрос в командной строке, в запросе она хочет знать какую команду следует временно забыть. Однажды указав имя команды, Автокад немедленно забудет о команде как будто ее вовсе не существовало. Итак когда команда вызвана, Автокад выходит из нее с сообщением «Неизвестная команда «Имя Команды» Нажмите F1 для входа в помощи». Однако, если ввести точку перед командой, как .LINE например, то Автокад моментально вспомнит о команде и потом забудет о ней снова. Пример использования UNDEFINE команды в Автолиспе выглядит так как на строчке кода ниже.
(command “undefine” “line”)

Помогаем Автокаду вспомнить
Если вы удалили определение команды используя UNDEFINE, вы можете использовать команду REDEFINE, чтобы помочь автокаду вспомнить команду еще раз. Несмотря на то что, обычно нет необходимости делать это, вы бы могли выбрать REDEFINE команду когда вы тестируете свое приложение, чтобы быть уверенным в том, что удаление определения команды прошло правильно, когда приложение загружено, или когда вы убираетесь после ваших обычных приложений. Также как и команда UNDEFINE, команда REDEFINE запрашивает имя команды. Однажды переопределенная, команда будет работать, именно так как была в Автокаде.
(command “redefine” “line”)

Переопределение команды
Пример ниже показывает как удалить определение команды Взрывания и после переопределить ее так, что она уже не будет взрывать Блоки, Мультитексты и размеры на чертеже. Эту процедуру следует добавить в файл ACADDOC.LSP, потому что он загружется когда создали новый чертеж или открыли.
;; Undefine the Explode command so you can redefine it using AutoLISP
(Command “._undefine” “explode”)
;; Custom Explode Command Override
(defun c:Explode ( / SS SS-FILTER SAVE-CMDECHO SS-CNT CNT-LOOP)
;; Save current value of CMDECHO into a local variable
(setq SAVE-CMDECHO (getvar “CMDECHO”))
;; Build entity exclusion filter
;; Use the expression to find out the DXF 0 value that needs
;; to be placed in the filter. (entget (car (entsel)))
(setq SS-FILTER
(list
(cons -4 “<NOT”)
(cons -4 “<OR”)
(cons 0 “INSERT”)
(cons 0 “MTEXT”)
(cons 0 “DIMENSION”)
;; By filtering out Lines, Circles and Arcs it helps to reduce
;; unnecessary prompts at the command line
(cons 0 “LINE”)
(cons 0 “CIRCLE”)
(cons 0 “ARC”)
(cons 0 “TEXT”)
(cons 0 “SOLID”)
(cons -4 “OR>”)
(cons -4 “NOT>”)
)
)
Sleekka вне форума  
 
Автор темы   Непрочитано 27.04.2007, 10:23
#19
RomanM

инженер
 
Регистрация: 25.04.2006
Москва
Сообщений: 1,207


Цитата:
Сообщение от Sleekka
Мда... не знал, что поля с датой такие вредные.
Ну да ладно все равно
Код:
- так выглядит стандартный макрос, на кнопку плот и на менюшку плот.
А мы берем и подменяем его на вот такой
Код:
[Выделить все]
^C^C(vl-cmdf "_updatefield" (ssget "A") "");_plot;
Тожа самое с сайвом и регеном. Ну и соответственно все ето на компы юзьверей.
НО!!! грамотнее было бы сделать вот так:
Это статья из журнала AUGIWorld переводил я.
Цитата:
Управление командами при помощи AutoLisp

Автокад иногда может служить помехой при внедрении стандартов, но с некоторой помощью вы можете научить Автокад вести себя немножечко иначе. Автокад предлагает множество команд к которым пользователь имеет доступ, но проблема заключается в том, что иногда вы хотите получить результат определенного типа от команды, когда она используется, вызвана ли команда из выпадающего меню, кнопкой на панели, или набрана в командной строке. Это не всегда проще сделать через адаптацию, но вы можете использовать команду UNDEFINE чтобы переучить Автокад тому, как команда должна действовать в различных случаях.Переобучение Автокада команде называется переопределение команды. В этой статье, Я покажу вам как удалить определение команды и обеспечить выполнение адаптированной версии команды при помощи Автолиспа.
Что значит удалить определение команды?
Автокад нагружен большим числом команд, в последнее время я насчитывал намного больше 800 команд и, да – это много. Каждая из этих команд немного другая, и временами вам хочется изменить поведение стандартной команды в некоторой степени, которая незначительно отличается от ее идеального состояния или возможно вы просто нехотите чувствовать себя слабым звеном используя индивидуальные команды постоянно.Автокадовксая команда UNDEFINE позволяет вам сказать Автокаду «забудь» о команде на все время пока рисунок в котором опрделение команды было удалено остается открытым. Автокад будет проявлять такую «амнезию» только на короткий промежуток времени, если конечно вы не будете говорить программе забывать о команде каждый раз когда создается или открывается рисунок. Команда UNDEFINE имеет один запрос в командной строке, в запросе она хочет знать какую команду следует временно забыть. Однажды указав имя команды, Автокад немедленно забудет о команде как будто ее вовсе не существовало. Итак когда команда вызвана, Автокад выходит из нее с сообщением «Неизвестная команда «Имя Команды» Нажмите F1 для входа в помощи». Однако, если ввести точку перед командой, как .LINE например, то Автокад моментально вспомнит о команде и потом забудет о ней снова. Пример использования UNDEFINE команды в Автолиспе выглядит так как на строчке кода ниже.
(command “undefine” “line”)

Помогаем Автокаду вспомнить
Если вы удалили определение команды используя UNDEFINE, вы можете использовать команду REDEFINE, чтобы помочь автокаду вспомнить команду еще раз. Несмотря на то что, обычно нет необходимости делать это, вы бы могли выбрать REDEFINE команду когда вы тестируете свое приложение, чтобы быть уверенным в том, что удаление определения команды прошло правильно, когда приложение загружено, или когда вы убираетесь после ваших обычных приложений. Также как и команда UNDEFINE, команда REDEFINE запрашивает имя команды. Однажды переопределенная, команда будет работать, именно так как была в Автокаде.
(command “redefine” “line”)

Переопределение команды
Пример ниже показывает как удалить определение команды Взрывания и после переопределить ее так, что она уже не будет взрывать Блоки, Мультитексты и размеры на чертеже. Эту процедуру следует добавить в файл ACADDOC.LSP, потому что он загружется когда создали новый чертеж или открыли.
;; Undefine the Explode command so you can redefine it using AutoLISP
(Command “._undefine” “explode”)
;; Custom Explode Command Override
(defun c:Explode ( / SS SS-FILTER SAVE-CMDECHO SS-CNT CNT-LOOP)
;; Save current value of CMDECHO into a local variable
(setq SAVE-CMDECHO (getvar “CMDECHO”))
;; Build entity exclusion filter
;; Use the expression to find out the DXF 0 value that needs
;; to be placed in the filter. (entget (car (entsel)))
(setq SS-FILTER
(list
(cons -4 “<NOT”)
(cons -4 “<OR”)
(cons 0 “INSERT”)
(cons 0 “MTEXT”)
(cons 0 “DIMENSION”)
;; By filtering out Lines, Circles and Arcs it helps to reduce
;; unnecessary prompts at the command line
(cons 0 “LINE”)
(cons 0 “CIRCLE”)
(cons 0 “ARC”)
(cons 0 “TEXT”)
(cons 0 “SOLID”)
(cons -4 “OR>”)
(cons -4 “NOT>”)
)
)
понял
попробую так
RomanM вне форума  
 
Непрочитано 11.06.2009, 15:46
#20
Kosenko Sasha


 
Регистрация: 10.01.2007
Kiev
Сообщений: 12


Цитата:
Сообщение от Sleekka Посмотреть сообщение
тока внутри дизеля поле вычисляется один раз и все.
А может есть другое решение, как решить данную задачку. Потому что иногда приходится переименовать файл, следовательно должно измениться поле, но поле уже не изменяется.
Kosenko Sasha вне форума  
 
Непрочитано 24.08.2016, 22:39
#21
konservnii


 
Регистрация: 23.08.2016
Сообщений: 14


Цитата:
Сообщение от Kosenko Sasha Посмотреть сообщение
А может есть другое решение, как решить данную задачку. Потому что иногда приходится переименовать файл, следовательно должно измениться поле, но поле уже не изменяется.
ПОдниму этот вопрос, можно как-либо сделать так чтобы в формуле diesel автоматически обновлялся заданный параметр подшивки например такой:

$(substr,%<\AcSm Sheet.Number \f "%fn2">%, 1, $(-, $(strlen, %<\AcSm Sheet.Number \f "%fn2">%), 2)) - выводит номер листа с подавлением последнего символа, например если был номер листа 12и ---> станет 12


\AcSm Sheet.Number - номер листа, если вбить эту формулу в dieselexpression то она срабатывает 1 раз. Я бы хотел чтобы при изменении листа в подшивке мое поле менялось тоже. Это можно как-нибудь реализовать..?
konservnii вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Изменение полей (fields)