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

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

Помогите с логикой программы

Ответ
Поиск в этой теме
Непрочитано 21.10.2005, 14:28 #1
Помогите с логикой программы
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,406

Башка уже не варит, если честно. Суть проблемы в следующем:
надо установить свойства одному объекту по другому. При этом можно устанавливать в разных сочетаниях слой, цвет, тип линии и вес линии. Если устанавливается, например, слой, то остальное брать со старого состояния. Если устанавливать слой и цвет, то тип линии и вес линии берутся со старого состояния. Вот тут и проблема - как определить, что устанавливать, а что нет. Списки старого состояния получены. Образец гарантированно есть. Изменяемый объект гарантированно есть.
Простая проверка (member) не срабатывает - может быть неопределенное количество аргументов в передаваемом списке (кстати, список можно и заменить, не особо проблема). Основная трудность в том, что если были установлены, например, цвет и тип линии ByLayer, то при смене слоя эти значения должны не остаться "ByLayer", а принять значения "старого" слоя. Голову же сломал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 4111
 
Непрочитано 21.10.2005, 15:51
#2
X-DeViL

Бизнес-шмизнес
 
Регистрация: 26.05.2004
Питер
Сообщений: 1,911


НИЧЕГО УДИВИТЕЛЬНОГО!

СЕГОДНЯ ТЯПНИЦА

А ты расслабься... )) возбми пифка и все сделается )) быстро и какчественно

Правда дельный совет? )))
X-DeViL вне форума  
 
Непрочитано 21.10.2005, 15:53
#3
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


С кодом конечно было бы проще...

В каком виде списки?
Lenich вне форума  
 
Автор темы   Непрочитано 21.10.2005, 16:02
#4
Кулик Алексей aka kpblc
Moderator

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


Да код топорный на самом деле, поскольку все писалось на ходу:
Код:
[Выделить все]
;|=============================================================================
*    Функция назначения свойств объекту "по образцу".
*    Параметры вызова:
*	ent-to-change	примитив, которому назначаются свойства
*	ent-sample	примитив, с которого берутся свойства
*	prop-list	список свойств, которые надо назначить : layer, ltype,
*			lweight, color. nil -> все.
*			Варианты:
			nil (или '()) - установить все по образцу
			'("layer")	установить слой. все остальное остается
			как на старой вставке
*    Примеры вызова:
(_kpblc-ent-properties-set-by-smaple (entlast) (entsel) nil) ; заменить все
(_kpblc-ent-properties-set-by-sample (entast) (entsel) '("layer" "color") ;
заменит слой по образцу и цвет по образцу, оставив тип линии и вес линии старым.
=============================================================================|;
(defun _kpblc-ent-properties-set-by-sample (ent-to-change  ent-sample
					    prop-list	   /
					    exist_prop
					    )
  (setq	ent-to-change (vlax-ename->vla-object ent-to-change)
	ent-sample    (vlax-ename->vla-object ent-sample)
	exist_prop    (list
			(cons "layer" (vla-get-layer ent-to-change))
			(cons "ltype" (vla-get-linetype ent-to-change))
			(cons "lweight" (vla-get-lineweight ent-to-change))
			(cons "color" (vla-get-color ent-to-change))
			) ;_ end of list
	) ;_ end of setq
  (if (= (assoc "ltype" exist_prop) "ByLayer")
    (subst (cons "ltype"
		 (vla-get-color
		   (vlax-ename->vla-object
		     (tblobjname "layer" (vla-get-layer ent-to-change))
		     ) ;_ end of vlax-ename->vla-object
		   ) ;_ end of vla-get-color
		 ) ;_ end of cons
	   (assoc "ltype" exist_prop)
	   exist_prop
	   ) ;_ end of subst
    ) ;_ end of if
  (if (= (assoc "lweight" exist_prop) -1)
    (subst (cons "lweight"
		 (vla-get-lineweight
		   (vlax-ename->vla-object
		     (tblobjname "layer" (vla-get-layer ent-to-change))
		     ) ;_ end of vlax-ename->vla-object
		   ) ;_ end of vla-get-lineweight
		 ) ;_ end of cons
	   (assoc "lweight" exist_prop)
	   exist_prop
	   ) ;_ end of subst
    ) ;_ end of if
  (if (= (assoc "color" exist_prop) 256)
    (subst (cons "color"
		 (vla-get-color
		   (vlax-ename->vla-object
		     (tblobjname "layer" (vla-get-layer ent-to-change))
		     ) ;_ end of vlax-ename->vla-object
		   ) ;_ end of vla-get-color
		 ) ;_ end of cons
	   (assoc "color" exist_prop)
	   exist_prop
	   ) ;_ end of subst
    ) ;_ end of if
   ;;; Вот теперь надо разбираться с тем, что и как анализировать
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2005, 16:23
#5
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Надо менять только в том случае, если свойства отличаются, я так понял что не ты устанавливаешь что менять а что нет.
тогда надо проверку делать (if (!= (assoc "ltype" exist_prop) (assoc "ltype" ent-to-change) .... и если они не равны, то соответственно свойство менять на тот который надо.
Lenich вне форума  
 
Автор темы   Непрочитано 21.10.2005, 16:34
#6
Кулик Алексей aka kpblc
Moderator

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


Не, я вот про что: например, меняемый объект лежит на слое 1, имеет цвет, тип и вес линии по слою (соответственно 1, center и 0,25). Перекидывается на слой 2 (там получаем цвет 2, тип - hidden, вес - 0,5). Так вот, мне надо заменить слой, а старые значения, которые были "ByLayer", воткнуть установленными. Т.е.
Было:
Слой 1
Цвет ByLayer
Тип ByLayer
Вес ByLayer
Стало:
Слой 2
Цвет 1
Тип Center
Вес 0,25
И проблема-то как раз в том, что как быть, если одновременно меняется, например, слой и цвет на "по образцу"? Остальное-то надо поменять...
Стоп, кажись, придумал.
---
Добавлено:
Не, ни фига, идея не сработала. :shock:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2005, 16:41
#7
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


А откуда ты знаешь, что менять надо слой (например) я чего то не въехал.
Lenich вне форума  
 
Автор темы   Непрочитано 21.10.2005, 17:05
#8
Кулик Алексей aka kpblc
Moderator

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


Да момент вызова функции буду анализировать. Это-то как раз на данный момент не особо проблема.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2005, 17:07
#9
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Накидал вариант без проверок.
Уж не занаю правильно ли понял задачу, но как уж понял
запускать (test)

Код:
[Выделить все]
;;;ent-in -примитив настройки которого будут меняться
;;;ent-out -примитив из которого будут браться настройки
;;;settings - список флагов (t / nil) переноса настроек
;;;(layer color linetype lineweight)

(defun kpblc-cnange-prop (ent-out ent-in settings)

    (setq ent-in  (vlax-ename->vla-object ent-in)
          ent-out (vlax-ename->vla-object ent-out)
    )

 ;установка слоя  
    (if (car settings)
        (vla-put-layer ent-in (vla-get-layer ent-out))
    )
 ;установка цвета
    (if (cadr settings)
        (if (= (vla-get-color ent-in) acByLayer)
            (vla-put-color ent-in
                           (my-get-lay-prop (vla-get-layer ent-out) "color")
            )
            (vla-put-color ent-in (vla-get-color ent-out))
        )
    )

 ;установка linetype
    (if (caddr settings)
        (if (= (vla-get-linetype ent-in) "BYLAYER")
            (vla-put-linetype
                ent-in
                (my-get-lay-prop (vla-get-layer ent-out) "linetype")
            )
            (vla-put-linetype ent-in (vla-get-linetype ent-out))
        )
    )

 ;установка lineweight
    (if (cadddr settings)
        (if (= (vla-get-lineweight ent-in) acLnWtByLayer)
            (vla-put-lineweight
                ent-in
                (my-get-lay-prop (vla-get-layer ent-out) "lineweight")
            )
            (vla-put-lineweight ent-in (vla-get-lineweight ent-out))
        )
    )
)

; вспомогательная функция получения свойств слоя
(defun my-get-lay-prop (lay-name prop)
    (vlax-get-property
        (vla-Item
            (vla-get-Layers
                (vla-get-activedocument (vlax-get-acad-object))
            )
            lay-name
        )
        prop
    )
)

(defun test ()
  (kpblc-cnange-prop
    (car (entsel))
    (car (entsel))
    '(t t nil nil)
  )
)
ps заметил пару верных ошибок исправил - acLnWtByLayer и "BYLAYER".
AY вне форума  
 
Непрочитано 21.10.2005, 17:14
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Может сделать как в Mictostation? Там при копировании свойств вылезает окно где можно поставить галки какие свойства копировать какие нет.

Т. к. окно не всегда нужно надо сделать две команды, одну с окном, другую без него. В команде без окна первой строкой напоминание что копируется. Типа:
Код:
[Выделить все]
Match properties = Layer, Color
Код:
[Выделить все]
Match properties = All Properties
{Smirnoff} вне форума  
 
Непрочитано 21.10.2005, 17:18
#11
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>{Smirnoff}
Почему Mictostation? А в Autocad разве иначе?
AY вне форума  
 
Непрочитано 21.10.2005, 17:23
#12
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Есть ещё один способ. Закодировать все свойства в одном запросе.
Код:
[Выделить все]
Match properties = Layer, Color
Type letter for property [Layer+Color+lineWeight+lineType]: wt
Match properties = Lineweight, Linetype
Это не совсем понятно для пользователя, но достаточно удобно. Я много раз делал подобный тип ввода, правда в программах "для себя".
{Smirnoff} вне форума  
 
Непрочитано 21.10.2005, 17:27
#13
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>AY

Дожил... Спасибо! Я в первый раз обратил внимание на [Settings]. Щелкнул и в экран а не в строку. Дожил... :?
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с логикой программы