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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp need

Lisp need

Закрытая тема
Поиск в этой теме
Непрочитано 23.04.2004, 13:50 #1
Lisp need
plaz
 
Проектирование обустройства нефтяных месторождений
 
Самара
Регистрация: 28.08.2003
Сообщений: 352

Lisp программисты помогите
Нужена програмка которая в пересечении 2х линий разрывает одну из них и место разрыва соединяет дугой. Хочу использовать при создании технологических схем. Может у кого есть в наработках?
[ATTACH]1082713823.jpg[/ATTACH]
Просмотров: 3490
 
Непрочитано 23.04.2004, 14:03
#2
{Smirnoff}

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


Вроде можно доработать одну мою програмку. На выходных если будет время сделаю (если надобность не отпадет раньше). Вопрос, надо ли объединять в полилинию два отрезка и дугу?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 23.04.2004, 14:19
#3
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Нет, объединять совсем не обязательно
plaz вне форума  
 
Непрочитано 23.04.2004, 14:44
#4
Apelsinov

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


писал давно, но работает
Код:
[Выделить все]
(defun c:peres
       (/ o a ap xy1 xy2 L L4 crug crug2 edge2 line1 line2 line6)
  (setq o (getvar "osmode"))
  (setvar "cmdecho" 0)

  (if (null mashtabx)
    (setq mashtabx (getreal "\n Введите масштаб:"))
  )
  		;Выбор линии
  (while (null L)
    (if	(null vopros)
      (setq vopros "No")
    )
    (initget "O")
    (princ (strcat "\n СКОБКИ: " vopros))
    (setq L
	   (nentsel
	     "\n Выберите разрываемую линию вблизи точки пересечения [Option]: "
	   )
    )
    (if	(eq L "O")
      (progn (initget 1 "Yes No")
	     (setq vopros (getkword "\n Рисовать скобку [Yes/No]: ")
		   L	  nil
	     )
      )
    )
  )
					;Точка центра круга
  (setq xy1 (car (cdr L)))
					; Отрисовка круга
  (setq ap (getvar "aperture"))
  (setvar "aperture" 50)
  (setvar "osmode" 2080)
  (setq a (* 1 mashtabx))
  (command "circle" xy1 a)
					;Уточнение центра круга
  (setq xy1 (getvar "lastpoint"))
  (setq L4 (list (car L) xy1))
					;Расчет разрыва  линии
  (setq line1 (ssget "_l"))
  (command "_trim" line1 "" L4 "")
					;Нахождение  круга
  (setq crug (ssget "_p"))
					;Расчет дуги
  (setq	line2 (ssget "_l")
	edge2 (getvar "EDGEMODE")
  )
  (setvar "EDGEMODE" 1)
  (setq	xy2 (list (- (car xy1) (* mashtabx 0.1))
		  (- (car (cdr xy1)) a)
		  (cadr (cdr xy1))
	    )
  )
  (setq crug3 (list (cadr (car (ssnamex crug))) xy2))
  (setq line6 (cdr (cadr (entget (cadr (car (ssnamex line2)))))))

  (if (eq vopros "No")
    (command "erase" crug "")
    (command "_trim" line2 "" crug3 "")
  )
  (if (eq "LINE" line6)
    (princ)
    (progn
      (princ
	"\n ОШИБКА: Выбранный объект не является линией, либо не найдена точка пересечения!"
      )
      (command "undo" 3)
    )
  )
					;Хвосты
  (setvar "aperture" ap)
  (setvar "osmode" o)
  (setvar "cmdecho" 1)
  (setvar "EDGEMODE" edge2)
  (princ)
)
Apelsinov вне форума  
 
Непрочитано 23.04.2004, 15:11
#5
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,265


2 Apelsinov
Что-то не работает - линию рвет, а полукруг не рисует!
Pilot вне форума  
 
Непрочитано 23.04.2004, 15:44
#6
Apelsinov

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


>Pilot
При запуске обратите внимание на [Option]
Apelsinov вне форума  
 
Непрочитано 23.04.2004, 16:31
#7
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,265


Понял. Заработало.
Pilot вне форума  
 
Автор темы   Непрочитано 23.04.2004, 17:23
#8
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


То что доктор прописал.
Спасибо
[sm154]
plaz вне форума  
 
Непрочитано 27.04.2004, 09:13
#9
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,265


Вопрос ко всем, кто уже успел попользоваться представленной Apelsinov-ым прогой: По вашему мнению, каков наиболее часто встречающийся или самый "красивый" размер рисуемой дуги в районе пересечения линий?
Дело в том, что прога оказалась действительно удобной, и я планирую (если уважаемый Автор не возражает) этот Лисп слегка модифицировать, исключив начальный запрос "масштаба" и привязав размер дуги ну, скажем, к высоте текущего текста.
Pilot вне форума  
 
Непрочитано 11.05.2004, 13:09
#10
Apelsinov

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


я так думаю, что наиболее удобноым размером будет 2мм (диаметр), заложенные в программе, А масштаб можно автоматически брать из переменной dimscale.
Apelsinov вне форума  
 
Автор темы   Непрочитано 13.05.2004, 13:08
#11
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


По мне наиболее удобный размер 3мм (радиус), что бы и на насыщенных схемах разрывы были бы видны.
Большой + к твоей программе, если бы отрисовываемая дуга закидывалась на слой разрываемой линии.
plaz вне форума  
 
Непрочитано 13.05.2004, 14:53
#12
Apelsinov

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


>plaz, вот вариант: масштаб задан по dimscale, расстояние 3мм, слой как просили.
Код:
[Выделить все]
(defun c:peres
	       (/ o a ap xy1 xy2 L L4 crug crug2 edge2 line1 line2 line6
		layer0)
  (setq o (getvar "osmode"))
  (setvar "cmdecho" 0)
(setq mashtabx (getvar "dimscale"))
					;Выбор линии
  (while (null L)
    (if	(null vopros)
      (setq vopros "No")
    )
    (initget "O")
    (princ (strcat "\n СКОБКИ: " vopros))
    (setq L
	   (nentsel
	     "\n Выберите разрываемую линию вблизи точки пересечения [Option]: "
	   )
    )
    (if	(eq L "O")
      (progn (initget 1 "Yes No")
	     (setq vopros (getkword "\n Рисовать скобку [Yes/No]: ")
		   L	  nil
	     )
      )
    )
  )
					;Точка центра круга
  (setq xy1 (car (cdr L)))
					; Отрисовка круга
  (setq ap (getvar "aperture"))
  (setvar "aperture" 50)
  (setvar "osmode" 2080)
  (setq a (* 1.5 mashtabx))
  (setq layer0 (getvar "clayer"))
  (setvar "clayer" (cdr (assoc 8 (entget (car L)))))
  (command "circle" xy1 a)
  (setvar "clayer" layer0)
					;Уточнение центра круга
  (setq xy1 (getvar "lastpoint"))
  (setq L4 (list (car L) xy1))
					;Расчет разрыва  линии
  (setq line1 (ssget "_l"))
  (command "_trim" line1 "" L4 "")
					;Нахождение  круга
  (setq crug (ssget "_p"))
					;Расчет дуги
  (setq	line2 (ssget "_l")
	edge2 (getvar "EDGEMODE")
  )
  (setvar "EDGEMODE" 1)
  (setq	xy2 (list (- (car xy1) (* mashtabx 0.1))
		  (- (car (cdr xy1)) a)
		  (cadr (cdr xy1))
	    )
  )
  (setq crug3 (list (cadr (car (ssnamex crug))) xy2))
  (setq line6 (cdr (cadr (entget (cadr (car (ssnamex line2)))))))

  (if (eq vopros "No")
    (command "erase" crug "")
    (command "_trim" line2 "" crug3 "")
  )
  (if (eq "LINE" line6)
    (princ)
    (progn
      (princ
	"\n ОШИБКА: Выбранный объект не является линией, либо не найдена точка пересечения!"
      )
      (command "undo" 2)
    )
  )
					;Хвосты
  (setvar "aperture" ap)
  (setvar "osmode" o)
  (setvar "cmdecho" 1)
  (setvar "EDGEMODE" edge2)
  (princ)
)
Apelsinov вне форума  
 
Автор темы   Непрочитано 13.05.2004, 15:14
#13
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


:!: :!: :!: YOU ARE THE BEST :!: :!: :!:
plaz вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp need

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск