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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Результат какой привязки в "LASPOINT" (getpoint)

Результат какой привязки в "LASPOINT" (getpoint)

Ответ
Поиск в этой теме
Непрочитано 01.12.2005, 13:27 #1
Результат какой привязки в "LASPOINT" (getpoint)
BH
 
Регистрация: 02.06.2005
Сообщений: 19

Для чего это надо : для полной поддержки ассоциативности размеров в "DIMKA" http://dwg.ru/dwl/168

Суть проблемы: переключая тип размера с "DIMLINEAR" на "DIMANGULAR" необходимо передать 2-е размерные точки...а как сохранить ассоциативность?(в режиме выбора образмериваемого обьекта проблем не возникает)

Соображения:
-если при передачи точек использовать туже привязку что и при их указании то в большинстве случаев(но не вовсех!) размер будет ассоциативным
Просмотров: 3661
 
Непрочитано 01.12.2005, 13:48
#2
Кулик Алексей aka kpblc
Moderator

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


Немного не понял. А почему бы не использовать dimassoc в этот момент? Собственно (getvar "lastpoint") возвращает последнюю введенную точку, т.е. фактически привязки, по-моему, не меняются.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2005, 14:08
#3
BH


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


1. ассоциативность размерных точек без использования привязок не возникает даже если ассоциативность включена(dimassoc)
2.если пользоваться разовыми привязками то при передачи точки необходимо указать эту использованную привязку....
BH вне форума  
 
Непрочитано 01.12.2005, 14:23
#4
Кулик Алексей aka kpblc
Moderator

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


Чего-то я не понимаю... Если код составляет секрет, то давай в почту, попробую хоть понять, в каком месте затык. Или попробуй сам получать точки при разных значениях osmode.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2005, 14:40
#5
BH


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


например:
(setvar "osmode" 1);;_end
(setq point1 (getpoint))
(setq point2 (getpoint))
(command "_DIMLINEAR" point1 point2 pause)

...если при задании точек выбрать разовую привязку _mid
то в таком случае размер будет построен неправильно или он будет не ассоциативным
....а если например (setvar "osmode" 23) и при указании точек воспользоваться перебором привязок ("TAB") то такая же фигня....
BH вне форума  
 
Непрочитано 01.12.2005, 15:01
#6
Кулик Алексей aka kpblc
Moderator

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


ИМХО: бесперспективняк. Мне никто не мешает в момент выбора точки поменять привязку (нажал Ctrl и правую мышь, выбирай чего хоцца). И никак не помешать - это дело не считается как pause.
Я бы сделал другое - обработчик ошибок, и к нему дополнительно 2 функции по сохранению системных переменных и их восстановлению (идея сперта с САПР на базе...):
Код:
[Выделить все]
;|=============================================================================
*    Переназначение обработки ошибок.
*    Переназначен или нет обработчик проверяется по значению
* переменной *kpblc-error*
=============================================================================|;
(defun kpblc-error-init	()
  (if (not *kpblc-error*)
    (setq *kpblc-error*
	   *error*
	  *error* kpblc-error
	  ) ;_ end of setq
    (setq *error*	*kpblc-error*
	  *kpblc-error*	nil
	  ) ;_ end of setq
    ) ;_if
  (princ)
  ) ;_defun
;|=============================================================================
*    Восстанавливаются системные переменные. Значения системных переменных
* должны храниться в глобальном списке *kpblc-sysvar-list*. Если списка нет
* (nil), происходит просто выход.
*    Параметры вызова:
*	Нет
*    Примеры вызова:
(kpblc-error-restore-sysvar)
=============================================================================|;
(defun kpblc-error-restore-sysvar ()
  (if *kpblc-sysvar-list*
    (foreach item *kpblc-sysvar-list*
      (setvar (car item) (cadr item))
      ) ;_ end of foreach
    ) ;_ end of if
  (setq *kpblc-sysvar-list* nil)
  (gc)
  ) ;_ end of defun
;|=======================================================================================
*    Сохраняется текущее значение системных переменных. Список глобальный (*kpblc-sysvar-list*)
* При условии, что заданы значения, они устанавливаются.
*    Поскольку список *kpblc-sysvar-list* не обнуляется, в нем хранится история изменения
* значений переменных.
*    Параметры вызова:
*	*kpblc-sysvar-list*	список системных переменных, состояние которых надо сохранить.
*			Список состоит из подсписков (Переменная Значение)
*			В списке могут повторяться Переменные. В таком случае будет
*			установлено последнее значение.
*			Если в качестве второго параметра используется nil, то значение
*			системной переменной просто сохраняется.
*    Примеры вызова:
(kpblc-error-sysvar-list (list '("cmdecho" 0) '("blipmode") '("osmode" 503)))
(kpblc-error-sysvar-list (kpblc-get-all-sysvar-list))
=======================================================================================|;
(defun kpblc-error-save-sysvar (sysvar-list)
  (foreach item	sysvar-list
    (setq *kpblc-sysvar-list*
	   (cons
	     (list (car item) (getvar (car item)))
	     *kpblc-sysvar-list*
	     ) ;_ end of cons
	  ) ;_ end of setq	
    (if	(cadr item)			; передано устанавливаемое значение
      (setvar (car item) (cadr item))
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun

;; И собственно простановка размеров
;; (kpblc-dli)
(defun kpblc-dli (/ *error* result)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (setq *error* kpblc-error)
  ;; Например, здесь идет создание слоя с именем "_РАЗМЕРЫ_"
  (kpblc-error-save-sysvar
    '(("dimassoc" 2)
      ("osmode" 503)
      ("celtype" "Continuous")
      ("cecolor" 2)
      ("celweight" 0)
      ;; Ну и так далее
      )
    ) ;_ end of kpblc-error-save-sysvar
  (command "_.dimlinear")
  (while (/= (getvar "cmdactive") 0)
    (command pause)
    ) ;_ end of while
  (kpblc-error-restore-sysvar)
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun
Вообще-то тут наверняка можно использовать (vl-catch-all-apply), но у меня с dim*-командами не сработало. Поэтому по-топорному поступаю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2005, 15:22
#7
BH


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


-Подобное решение было мной реализовано несколько лет назат в сборнике "BLACKHORSE"
-проблема в специфике работы программы "DIMKA".
например:указав 2-е размерные точки и перейдя в режим указания положения текста можно переключиться с "_DIMLINEAR" на "_DIMANGULAR" вводом "ENTER"...читай описание по ссылке...http://dwg.ru/dwl/168

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

Влюбом случае спасибо!
BH вне форума  
 
Непрочитано 01.12.2005, 15:38
#8
Кулик Алексей aka kpblc
Moderator

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


Ну если уж совсем прижало, то можно, наверное сделать так (на уровне идеи): после указания точки положения текста / размерной линии вычислить кон.точки образмериваемого объекта (только головняк это, скорее всего - надо учитывать варианты полилиний с дублирующимися вершинами, элементы, входящие в блоки и внешние ссылки...) и устанавливать уже их для последнего проставленного размера. Пупок развяжется (с)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.12.2005, 16:02
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Прочитав что выше, мне показалось что проблема в программном задании ассоциативности размеру. А такое воообще возможно?

И, как мне думается, привязки тут вообще не при чем.
Apelsinov вне форума  
 
Автор темы   Непрочитано 01.12.2005, 16:28
#10
BH


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


RE Apelsinov

-программное задание ассоциативности размера конечно бы решило все вопросы...но мне даже спрашивать об этом было страшно...
-а если решить вопрос с определением используемой привязки при указании размерной точки, то можно было бы обеспечить ассоциативность размеров в большинстве случаев.
BH вне форума  
 
Непрочитано 01.12.2005, 16:33
#11
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun test (/)
  (command "_.dimlinear")
  (while (/= (getvar "cmdactive") 0)
    (command pause)
    ) ;_ end of while
  (kpblc-error-save-sysvar '(("cmdecho" 0) ("nomutt" 1)))
  (command "_.dimreassociate" (entlast))
  (while (/= (getvar "cmdactive") 0)
    (command "")
    ) ;_ end of while
  (kpblc-error-restore-sysvar)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Результат какой привязки в "LASPOINT" (getpoint)