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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание реактора для отслеживания изменения текста

Создание реактора для отслеживания изменения текста

Ответ
Поиск в этой теме
Непрочитано 28.04.2012, 08:54 #1
Создание реактора для отслеживания изменения текста
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

День добрый.
Раньше с реакторами дела никогда не имел. Внимательно прочел их описание, мало что понял.
Поэтому подскажите на примере, как это сделать.
Пример:
На чертеже разбросаны три примитива TEXT - А1, А2, А3.
Как мне создать реактор, который отлавливал бы изменение текста, например, после изменения А2 на В7 я хочу видеть сообщение на экране "А2 изменен на В7" ?
Просмотров: 5049
 
Непрочитано 28.04.2012, 09:13
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Шаг1: Смотрим в любом справочнике: реактор объекта - это :vlr-object-reactor.
Шаг2: Поиск по форуму по слову :vlr-object-reactor.

Примеров найдешь немало
Do$ вне форума  
 
Непрочитано 28.04.2012, 09:39
#3
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Do$, я бы не стал использовать объектный реактор, из-за того, что тогда нужно будет каждый новый созданный текстовый примитив добавлять в список примитивов объектного реактора, мой вариант использовать реактор базы на событие “примитив изменен”
Код:
[Выделить все]
 
; ----------------------------------------------------------------------------------------------------------------------
(defun objectModified(reac data / ) ; примитив изменен
  ((lambda(ent)
     ((lambda(ed)
        (if (= (cdr (assoc 0 ed)) "TEXT")
          (if *text-modified*
            (progn
              (alert (strcat *text-modified* " изменен на " (cdr (assoc 1 ed))))
              (setq *text-modified* nil)
              )
            (setq *text-modified* (cdr (assoc 1 ed)))
            )
          )
        )
       (entget ent)
       )
     )
    (cadr data)
    )
)
; ------------------------------------------------------------------------------------------------------------------------


; ------------------------------------------------------------------------------------------------------------------------
(setq AcDb_Reac (vlr-acdb-reactor "Реактор базы: "
		  (list '(:VLR-objectModified . objectModified)
			)
		  )
      )
; ------------------------------------------------------------------------------------------------------------------------
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 28.04.2012, 09:46
#4
swkx


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


Я то как раз и не могу для себя уяснить, что именно мне нужно отслеживать: изменение объекта или изменение базы данных чертежа...
swkx вне форума  
 
Непрочитано 28.04.2012, 10:05
#5
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от swkx Посмотреть сообщение
Я то как раз и не могу для себя уяснить, что именно мне нужно отслеживать: изменение объекта или изменение базы данных чертежа...
swkx, вариантов может быть много, например, можно еще по командному реактору отслеживать.
Реактор объекта:
+ : срабатывает только при изменении конкретных объектов
- : новые примитивы нужно будет добавлять в список, отслеживаемых ректором объектов
Ректор базы:
+ : новые примитивы не надо никуда добавлять
- : будет срабатывать при изменении любого объекта, поэтому в моем варианте есть строка (= (cdr (assoc 0 ed)) "TEXT")
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 28.04.2012, 10:27
#6
swkx


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


Спасибо всем, буду разбираться.
swkx вне форума  
 
Непрочитано 28.04.2012, 11:04
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Как я понял из первого сообщения, нужно отслеживать изменение конкретных объектов типа текст. Если ведется наблюдение за тремя текстами, то постоянно отслеживать изменение базы и проверять не эти ли тексты изменились - нерационально. Если же нужно отслеживать все тексты чертежа, тогда, конечно же, надо за базой чертежа следить.
Do$ вне форума  
 
Автор темы   Непрочитано 28.04.2012, 11:27
#8
swkx


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


Нужно отслеживать только тексты, причем они все заранее известны, поэтому мне оба варианта подойдут.
Тут возник другой вопрос:записать изменения в таблицу в чертеже.
Пересмотрел методы таблицы GetCell... и SetCell..., но нигде не нашел методов записи значения в ячейку и чтения значения из ячейки. Подскажите, плиз, как с ними работать.
Не хочу открывать новую тему...
swkx вне форума  
 
Непрочитано 28.04.2012, 11:42
#9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от swkx Посмотреть сообщение
но нигде не нашел методов записи значения в ячейку и чтения значения из ячейки. Подскажите, плиз, как с ними работать.
Не хочу открывать новую тему...
Плохо искал, см. выделено красным
Код:
[Выделить все]
_$ (vlax-dump-object tbl t)
; IAcadTable2: Èíòåðôåéñ IAcadTable2
; Çíà÷åíèÿ ñâîéñòâ:
;   AllowManualHeights = 0
;   AllowManualPositions = 0
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00d73d3c>
;   BreaksEnabled = 0
;   BreakSpacing = 24.75
;   Columns = 3
;   ColumnWidth (RO) = ...Èíäåêñèðîâàííîå ñîäåðæèìîå íå âûâîäèòñÿ...
;   Direction = (1.0 0.0 0.0)
;   Document (RO) = #<VLA-OBJECT IAcadDocument 124e37a8>
;   EnableBreak (RO) = ...Èíäåêñèðîâàííîå ñîäåðæèìîå íå âûâîäèòñÿ...
;   FlowDirection = 0
;   Handle (RO) = "223"
;   HasExtensionDictionary (RO) = 0
;   HasSubSelection (RO) = 0
;   HeaderSuppressed = 0
;   Height = 110.0
;   HorzCellMargin = 1.5
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 01e99c4c>
;   InsertionPoint = (1065.75 1102.56 0.0)
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   MinimumTableHeight (RO) = 110.0
;   MinimumTableWidth (RO) = 27.0
;   ObjectID (RO) = 2130274136
;   ObjectName (RO) = "AcDbTable"
;   OwnerID (RO) = 2130267384
;   PlotStyleName = "ByLayer"
;   RegenerateTableSuppressed = 0
;   RepeatBottomLabels = 0
;   RepeatTopLabels = 0
;   RowHeight (RO) = ...Èíäåêñèðîâàííîå ñîäåðæèìîå íå âûâîäèòñÿ...
;   Rows = 12
;   StyleName = "Standard"
;   TableBreakFlowDirection = 1
;   TableBreakHeight = 0.0
;   TableStyleOverrides (RO) = nil
;   TitleSuppressed = 0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 0ea40c60>
;   VertCellMargin = 1.5
;   Visible = -1
;   Width = 27.0
; Ïîääåðæèâàåìûå ìåòîäû:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   ClearSubSelection ()
;   ClearTableStyleOverrides (1)
;   Copy ()
;   CreateContent (3)
;   Delete ()
;   DeleteCellContent (2)
;   DeleteColumns (2)
;   DeleteContent (2)
;   DeleteRows (2)
;   EnableMergeAll (3)
;   FormatValue (4)
;   GenerateLayout ()
;   GetAlignment (1)
;   GetAttachmentPoint (2)
;   GetAutoScale (2)
;   GetAutoScale2 (3)
;   GetBackgroundColor (1)
;   GetBackgroundColorNone (1)
;   GetBlockAttributeValue (3)
;   GetBlockAttributeValue2 (4)
;   GetBlockRotation (2)
;   GetBlockScale (2)
;   GetBlockTableRecordId (2)
;   GetBlockTableRecordId2 (3)
;   GetBoundingBox (2)
;   GetBreakHeight (1)
;   GetCellAlignment (2)
;   GetCellBackgroundColor (2)
;   GetCellBackgroundColorNone (2)
;   GetCellContentColor (2)
;   GetCellDataType (4)
;   GetCellExtents (3)
;   GetCellFormat (2)
;   GetCellGridColor (3)
;   GetCellGridLineWeight (3)
;   GetCellGridVisibility (3)
;   GetCellState (2)
;   GetCellStyle (2)
;   GetCellStyleOverrides (2)
;   GetCellTextHeight (2)
;   GetCellTextStyle (2)
;   GetCellType (2)
;   GetCellValue (2)
;   GetColumnName (1)
;   GetColumnWidth (1)
;   GetContentColor (1)
;   GetContentColor2 (3)
;   GetContentLayout (2)
;   GetContentType (2)
;   GetCustomData (4)
;   GetDataFormat (3)
;   GetDataType (3)
;   GetDataType2 (5)
;   GetExtensionDictionary ()
;   GetFieldId (2)
;   GetFieldId2 (3)
;   GetFormat (1)
;   GetFormula (3)
;   GetGridColor (2)
;   GetGridColor2 (3)
;   GetGridDoubleLineSpacing (3)
;   GetGridLineStyle (3)
;   GetGridLinetype (3)
;   GetGridLineWeight (2)
;   GetGridLineWeight2 (3)
;   GetGridVisibility (2)
;   GetGridVisibility2 (3)
;   GetHasFormula (3)
;   GetMargin (3)
;   GetMinimumColumnWidth (1)
;   GetMinimumRowHeight (1)
;   GetOverride (3)
;   GetRotation (3)
;   GetRowHeight (1)
;   GetRowType (1)
;   GetScale (3)
;   GetSubSelection (4)
;   GetText (2)
;   GetTextHeight (1)
;   GetTextHeight2 (3)
;   GetTextRotation (2)
;   GetTextString (3)
;   GetTextStyle (1)
;   GetTextStyle2 (3)
;   GetValue (3)
;   GetXData (3)
;   Highlight (1)
;   HitTest (4)
;   InsertColumns (3)
;   InsertColumnsAndInherit (3)
;   InsertRows (3)
;   InsertRowsAndInherit (3)
;   IntersectWith (2)
;   IsContentEditable (2)
;   IsEmpty (2)
;   IsFormatEditable (2)
;   IsMergeAllEnabled (2)
;   IsMergedCell (6)
;   MergeCells (4)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   MoveContent (4)
;   RecomputeTableBlock (1)
;   RemoveAllOverrides (2)
;   ReselectSubRegion ()
;   ResetCellValue (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   Select (8)
;   SelectSubRegion (10)
;   SetAlignment (2)
;   SetAutoScale (3)
;   SetAutoScale2 (4)
;   SetBackgroundColor (2)
;   SetBackgroundColorNone (2)
;   SetBlockAttributeValue (4)
;   SetBlockAttributeValue2 (5)
;   SetBlockRotation (3)
;   SetBlockScale (3)
;   SetBlockTableRecordId (4)
;   SetBlockTableRecordId2 (5)
;   SetBreakHeight (2)
;   SetCellAlignment (3)
;   SetCellBackgroundColor (3)
;   SetCellBackgroundColorNone (3)
;   SetCellContentColor (3)
;   SetCellDataType (4)
;   SetCellFormat (3)
;   SetCellGridColor (4)
;   SetCellGridLineWeight (4)
;   SetCellGridVisibility (4)
;   SetCellState (3)
;   SetCellStyle (3)
;   SetCellTextHeight (3)
;   SetCellTextStyle (3)
;   SetCellType (3)
;   SetCellValue (3)
;   SetCellValueFromText (4)
;   SetColumnName (2)
;   SetColumnWidth (2)
;   SetContentColor (2)
;   SetContentColor2 (4)
;   SetContentLayout (3)
;   SetCustomData (4)
;   SetDataFormat (4)
;   SetDataType (3)
;   SetDataType2 (5)
;   SetFieldId (3)
;   SetFieldId2 (5)
;   SetFormat (2)
;   SetFormula (4)
;   SetGridColor (3)
;   SetGridColor2 (4)
;   SetGridDoubleLineSpacing (4)
;   SetGridLineStyle (4)
;   SetGridLinetype (4)
;   SetGridLineWeight (3)
;   SetGridLineWeight2 (4)
;   SetGridVisibility (3)
;   SetGridVisibility2 (4)
;   SetMargin (4)
;   SetOverride (4)
;   SetRotation (4)
;   SetRowHeight (2)
;   SetScale (4)
;   SetSubSelection (4)
;   SetText (3)
;   SetTextHeight (2)
;   SetTextHeight2 (4)
;   SetTextRotation (3)
;   SetTextString (4)
;   SetTextStyle (2)
;   SetTextStyle2 (4)
;   SetToolTip (3)
;   SetValue (4)
;   SetValueFromText (5)
;   SetXData (2)
;   TransformBy (1)
;   UnmergeCells (4)
;   Update ()
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 28.04.2012, 11:59
#10
swkx


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


Как получить дамп таблицы, понятно, а как получить дамп ячейки - не доходит(..
swkx вне форума  
 
Непрочитано 28.04.2012, 12:19
#11
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от swkx Посмотреть сообщение
Как получить дамп таблицы, понятно, а как получить дамп ячейки - не доходит(..
У ячейки нет дампа.
Код:
[Выделить все]
 
;tbl - таблица
(vla-GetCellValue tbl <строка> <колонка>) ; значение ячейки в виде варианта
(vlax-variant-value (vla-GetCellValue tbl 0 0)) ; текст в ячейке 0 0
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 28.04.2012, 12:25
#12
swkx


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


TararykovDG,

спасибо!
swkx вне форума  
 
Непрочитано 28.04.2012, 23:24
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
Как мне создать реактор, который отлавливал бы изменение текста, например, после изменения А2 на В7 я хочу видеть сообщение на экране "А2 изменен на В7" ?
Какова практическая польза? Может тебе целесообразней воспользоваться "родным" механизмом в виде полей (fields)?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.04.2012, 23:30
#14
swkx


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


hwd,

а чуть подробнее, о чем речь ?
swkx вне форума  
 
Непрочитано 28.04.2012, 23:35
#15
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
hwd,

а чуть подробнее, о чем речь ?
Войди в редактор текста и из контекстного меню выбери пункт "Insert Field". В курсе, как этим пользоваться? Можно привязываться к свойствам или же составлять различные формулы, в составе которых считывать и использовать в процессе вычисления нужные свойства др. примитивов или значения ячеек таблиц, или свойства подшивки, ну и т.п...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 28.04.2012, 23:44
#16
swkx


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


вообще не знал про такую штуковину.
попробовал, но пока не осознал))

спасибо за наводку
swkx вне форума  
 
Автор темы   Непрочитано 02.05.2012, 19:56
#17
swkx


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


Появился вопрос:
а как мне в функции действия добраться до прежнего значения измененного текста ?

Создал реактор
Код:
[Выделить все]
(setq textr (vlr-object-reactor vlaobj "Test" (list '(:vlr-modified . objmodified))))
Создал функцию действия
Код:
[Выделить все]
(defun objmodified (vlao reac args /)

	(alert (vla-get-TextString vlao))
)
С помощью (vla-get-TextString vlao) получаю новое значение, а старое как достать ??

.....
Дошло, вопрос снят.

Последний раз редактировалось swkx, 03.05.2012 в 14:50. Причина: Вопрос решен.
swkx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание реактора для отслеживания изменения текста

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Создание слоя(слоёв) из мастер-списка. Изменения в программу CLAY от JefferyPSanders 99xt1 LISP 24 01.12.2014 12:24
Создание точки поверхности Civil 3D из текста Maria-Mirabella Вертикальные решения на базе AutoCAD 29 26.02.2013 07:18
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Создание линии типа "_______текст_______ " с возможностью изменение текста xabraxabra AutoCAD 18 03.10.2011 02:35
Создание макроса для однострочного текста Serega_ti Программирование 10 19.11.2008 16:21