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

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

Помогите зациклить программу с полилинией.

Ответ
Поиск в этой теме
Непрочитано 21.09.2014, 22:51 #1
Помогите зациклить программу с полилинией.
jackUAROBEY
 
Проектировщик ВК
 
Анапа
Регистрация: 18.09.2014
Сообщений: 58

Всем привет. Помогите зациклить программу. В конце кода вместо повторяющегося (TTN) не знаю как сделать чтоб точки строила и заканчивалась не NIL.
Код:
[Выделить все]
  
; по готовой трассе
(progn
  (princ " \nНаберите в командной строке:")
  (princ "\nземл - начинает строить полилинию")
  );progn
(defun c:земл ( /  krd1 otm1 krdx1 krdy1 t1 pln)
  (initget 1 " Пр Нат П Н На ")
  (setq rezg (getkword "[Проектная Пр/Натурная Нат]:"))
  (setq snn (getvar "CELWEIGHT"))  
  (setq snp (getvar "CELTYPE"))
  (if (= rezg "Пр")
    (progn
     (setvar "CELTYPE" "CONTINUOUS")
     (setvar "CELWEIGHT" 30)
     );progn
    (progn
     (setvar "CELWEIGHT" 20)
     (setvar "CELTYPE" "AHIDDEN4")
     );progn
    );if
  (initget 128)
  (setq hg (getreal (strcat "Введите значение условного горизонта " "<" (if (= US_GOR nil) (rtos 0 2 2) (rtos US_GOR 2 2) ) ">")))
  (setq US_GOR (if (= hg nil) US_GOR HG)); ввод вещественного числа
  (setq n 0)
  (setq krd1 (getpoint "Выберите точку начала построения: "))
  (setq pln (car (entsel "Выберите трассу (полилинию):")))
  (setq otm1  (getreal "\nВведите отметку в мм:"))
  (setq krdx1 (+  (car (cdr krd1)) (- otm1 (* US_GOR 1000))))
  (setq krdy1 (+(car krd1) 1500))
  (setq t1 (list   krdY1 krdX1 0))
  (Defun TTN ( / krdn otmn krdxn krdYn tn)
    (progn
      (setq n (1+ n))
      (setq krdn (vlax-curve-getDistAtParam pln n))
      (setq otmn (getreal "\nВведите отметку в мм:"))
      (Setq krdxn (+ (car (cdr krd1)) (- otmn (* US_GOR 1000))))
      (setq krdYn  (+ (+ (car krd1) 1500) krdn))
      (Setq tn (list  krdYn krdxn 0))
      ) ;progn
    );defun
  (command "_.pline" t1 (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN) (TTN))
  (setvar "CELWEIGHT" snn)
  (setvar "CELTYPE" snp)
  );defun
Просмотров: 3506
 
Непрочитано 21.09.2014, 23:00
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Повтор TTN в Вашей программе не самая большая беда. ИХМО Вы ее либо всю переделайте, либо оставьте так - как "образец".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.09.2014, 23:49
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Зациклить можно вызвав command до while, далее в command подставлять точки.
Как пример в твоей команде см ниже
Код:
[Выделить все]
  ; по готовой трассе
(progn
  (princ " \nНаберите в командной строке:")
  (princ "\nземл - начинает строить полилинию")
  );progn
(defun c:земл ( /  krd1 otm1 krdx1 krdy1 t1 pln)
  (initget 1 " Пр Нат П Н На ")
  (setq rezg (getkword "[Проектная Пр/Натурная Нат]:"))
  (setq snn (getvar "CELWEIGHT"))  
  (setq snp (getvar "CELTYPE"))
  (if (= rezg "Пр")
    (progn
     (setvar "CELTYPE" "CONTINUOUS")
     (setvar "CELWEIGHT" 30)
     );progn
    (progn
     (setvar "CELWEIGHT" 20)
     (setvar "CELTYPE" "AHIDDEN4")
     );progn
    );if
  (initget 128)
  (setq hg (getreal (strcat "Введите значение условного горизонта " "<" (if (= US_GOR nil) (rtos 0 2 2) (rtos US_GOR 2 2) ) ">")))
  (setq US_GOR (if (= hg nil) US_GOR HG)); ввод вещественного числа
  (setq n 0)
  (initget 1)
  (setq krd1 (getpoint "Выберите точку начала построения: "))
  (setq pln (car (entsel "Выберите трассу (полилинию):")))
  (setq otm1  (getreal "\nВведите отметку в мм:"))
  (setq krdx1 (+  (car (cdr krd1)) (- otm1 (* US_GOR 1000))))
  (setq krdy1 (+(car krd1) 1500))
  (setq t1 (list   krdY1 krdX1 0))
  (command "_.pline" "_non" t1) ;Вызываем команду pline временно отключаем привязки ("_non")
                                                ; Команда остается активной в ожидании последующих точек
(while (setq otmn (getreal "\nВведите отметку в мм <выход>:"))
       (setq n (1+ n))
      (setq krdn (vlax-curve-getDistAtParam pln n))
      (Setq krdxn (+ (car (cdr krd1)) (- otmn (* US_GOR 1000))))
      (setq krdYn  (+ (+ (car krd1) 1500) krdn))
      (command "_non" (list  krdYn krdxn 0)) ;Передаем в активную команду точку, временно отключаем привязки ("_non")
  )
  (command "") ;_Передаем в активную команду пустой ввод (Enter), тем самым завершая команду
  (setvar "CELWEIGHT" snn)
  (setvar "CELTYPE" snp)
  (princ)
  );defun
Не понятно, что за профиль такой, где условный горизонт задается в метрах, а отметки в мм
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 22.09.2014 в 09:07.
VVA вне форума  
 
Автор темы   Непрочитано 22.09.2014, 07:06
#4
jackUAROBEY

Проектировщик ВК
 
Регистрация: 18.09.2014
Анапа
Сообщений: 58


Спасибо. Сегодня проверю. Догадывался что надо while но не мог правильно поставить. Пишу программки чтоб продольный профиль сети канализации и водопровода строить. Пока начальная стадия, со временем надеюсь усовершенствовать и превратить в полноценную программу.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
Не понятно, что за профиль такой, где условный горизонт задается в метрах, а отметки в мм
Да это можно подправить. Мне удобней когда так.

Последний раз редактировалось jackUAROBEY, 22.09.2014 в 07:17.
jackUAROBEY вне форума  
 
Непрочитано 22.09.2014, 07:21
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Продольный профиль, как я понимаю, в реальности должен находиться в вертикальной плоскости. Ты же пытаешься его строить в горизонтальной плоскости, поскольку полилинию можно отрисовать только в плоскости XY или ей параллельной. Мало ли как там раньше чертили на кульмане...
Profan вне форума  
 
Непрочитано 22.09.2014, 07:23
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Однако есть Civil 3D
trir вне форума  
 
Непрочитано 22.09.2014, 09:06
1 | #7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


jackUAROBEY, Добавил в #3 пояснения
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.09.2014, 09:42
1 | #8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Пишу программки чтоб продольный профиль сети канализации и водопровода строить. Пока начальная стадия, со временем надеюсь усовершенствовать и превратить в полноценную программу.
Это сложная задача, и решать её надо совершенно не так. Нарисовать сам профиль несложно. Хоть тыщу километров. Были бы данные - то, что заносится в форму.
Но реальный профиль придется не раз переделывать - наткнулись на пересечения и т.п. Вы пытаетесь примитивно и последовательно запрашивать данные, причем самыми ненадежными способами. Вот, не ввел пользователь число, неправильно указал точку, промахнулся при entsel, нажал ESC - что будет? Программа рухнет. А если надо было 100 точек обработать, а рухнуло на 90-й? Начинать сначала?

А если надо исправить участок профиля? Всё заново? А если рабочий день закончился, и продолжать надо завтра? А что, отметки пользователь должен "глазами высчитывать" с плана, который сейчас не перед глазами? Вручную их интерполировать?

Тут возникает множество вопросов. Решать их надо отдельными функциями, из множества которых потом уже собирать простую и ясную программу. Например, отдельные надежные функции ввода - хот точки, хоть числа. Со 100% гарантией, что будет введено именно то, что надо. А если не введено - то разветвление в программе. Может это выход будет, а может возврат к предыдущей точке.

Ну и накопление данных надо вести в файл. Может и в простой текстовый, а может и в таблицу БД - чтобы вернуться к любой точке. Тут уж и без графического интерфейса пользователя не обойтись. Да и сами точки для профиля брать полуавтоматически из чертежа плана - указанием на трассу. Да и отметки тоже надо полуавтоматически брать, не через getreal.

А потом уже и по готовым данным профиль нарисовать - это самое простое будет. Да и то надо учитывать "вписываемость в формат", разделение на ответвление и прочее. И "зациклить" окажется совсем детской проблемой.
ShaggyDoc вне форума  
 
Непрочитано 22.09.2014, 09:59
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Один из вариантов подобного - у hwd
Как вариант для упрощения на первое время - использовать тот же эксель для набивания данных: благо редактор + сохранение результатов в одном лице+возможность прикрутить VBA для мелкой автоматизации. А потом перегонять в csv, и в лиспе считывать данные и строить. А потом, когда надоест использовать костыль в виде экселя, и определяется конкретные пожелания к программе - уже на что-то более серьезно замахнуться)
Сергей812 вне форума  
 
Автор темы   Непрочитано 22.09.2014, 21:55
#10
jackUAROBEY

Проектировщик ВК
 
Регистрация: 18.09.2014
Анапа
Сообщений: 58


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Это сложная задача, и решать её надо совершенно не так.
Спасибо. Что так все красочно описали. Я с Lisp полгода как только познакомился. Времени мало чтоб плотно углубиться. Да и профиля на работе не большие. В принципе все сводится к упрощению текущей работы. Ну а там по мере накопления опыта может что и родиться.

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
jackUAROBEY, Добавил в #3 пояснения
Спасибо я в принципе сразу разобрался. Получилось то что надо.
jackUAROBEY вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите зациклить программу с полилинией.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти программу для расчета прогибов L_S Расчетные программы 46 06.12.2007 22:14
Помогите написать программу на AUTOLISP'e Сергей123 LISP 28 06.09.2007 12:20
Помогите отладить lisp программу Мишаня LISP 7 31.07.2006 12:54
Помогите доделать программу добавления объектов в блок МишаVBA Программирование 1 20.05.2006 01:04
Помогите исправить программу 3DSPIRAL для 2006 vn Программирование 8 05.04.2006 13:15