1. ВНИМАНИЕ! В течении пары дней +- будет переезд форума на более защищённый сервер. Возможны периодические перебои в работе.

помогите наставлением по лиспу

Тема в разделе "Autodesk", создана пользователем mihamster, 30 окт 2014.

  1. mihamster

    mihamster Форумчанин

    извиняюсь, если подобные темы были.
    начал по немногу изучать лисп.
    на данном этапе, хотелось бы, что бы помогли понять следующее:

    есть код
    Код:
    (setq znach (entget (car (entsel))))
    (setq q0 (car znach))
    (setq q1 (cons 62 53))
    (setq q_add (list q0 q1))
    (entmod q_add)
    При работе с монотекстом работает, цвет изменяется... с мультитекстом не хочет.. в чем подвох?
     
  2. ivsem

    ivsem Форумчанин

    Изменяем цвет примитива в чертеже на цвет с номером 53.
    Код:
    (setq PrimitivDXF(entget (car (entsel)))) ;получаем список DXF кодов выбранного в чертеже примитива
    (setq PrimitivDXF(subst (cons 62 53)(assoc 62 PrimitivDXF) PrimitivDXF)); заменяем в списке кодов цвет на новый (53)
    (entmod PrimitivDXF) ; модифицируем примитив в чертеже
     
    Последнее редактирование: 31 окт 2014
    mihamster нравится это.
  3. BearDyugin

    BearDyugin Модератор Форумчанин

    Код:
    (setq PrimitivDXF (entget (car (entsel)))) ;_получаем список DXF кодов выбранного в чертеже примитива
    (setq PrimitivDXF ;_вносим изменения в список DXF кодов
    	   (if (setq col_dxf (assoc 62 PrimitivDXF)) ;_если в списке DXF кодов есть группа 62
    (subst '(62 . 53) col_dxf PrimitivDXF) ;_то меняем старыю группу на новую с нужным нам значением
    (append PrimitivDXF '((62 . 53))) ;_иначе просто добовляем к DXF списку группу 62 с нужным нам значением цвета
    	   )
    )
    (entmod PrimitivDXF) ; модифицируем примитив в чертеже
     
    mihamster нравится это.
  4. mihamster

    mihamster Форумчанин

    Да, спасибо.. добавление с 'если', на тот случай если исходный цвет 'по слою'.
    не то что бы я зануда.. но все таки.. почему модификация списком из имени+измененный эл-нт, с простым текстом работает корректно, а с мульти, ничего не меняет.. это как то связано с возможностями примитива? Хотелось бы понять. Спасибо
     
  5. BearDyugin

    BearDyugin Модератор Форумчанин

    На самом деле вообще удивительно, что она так работает ::biggrin24.gif::.
     
  6. -=13=-

    -=13=- Форумчанин

  7. mihamster

    mihamster Форумчанин

    Disney, такой пример был в книге Палещука))..
    -=13=-, хорошо и там зарегистрируюсь.
     
  8. BearDyugin

    BearDyugin Модератор Форумчанин

    Книга Полющука лежит у меня на столе, где там такой пример?
     
  9. mihamster

    mihamster Форумчанин

    Я забыл диск дома), как приеду домой напишу.
     
  10. mihamster

    mihamster Форумчанин

    "Полещук Николай - AutoLISP и Visual LISP в среде AutoCAD"
    и честно говоря, там так, как вы написали)...
    сейчас уже не вспомню, тогда, откуда взял свой пример... одновременно еще дополняю поиском по инету о тех или иных функциях..

    на днях думаю добью одну функцию, и был бы благодарен замечаниям каким нибудь, по выложенному коду)
     
  11. mihamster

    mihamster Форумчанин

    получилось даже раньше.

    программа для вычисления отклонений отметок горизонтальных поверхностей от проекта.
    до этой функции, в другой, еще будут заданы 2 переменные "otm_pr" (проектная отметка в масштабе чертежа) и "scale_otk" (масштаб вычисленного отклонения (N:1) т.е. если чертеж в метрах, а отклонения нужны в мм, надо задать "1000")
    Код:
    (defun rezult (/ znach q1 q2 rez spisok txt_found)
      (setq spisok (ssget '((0 . "*text"))) i 0) ;создание селекшн сета из текста и мульти-текса
      (while (< i (sslength spisok)) ;количество циклов по количеству примитивов в сете
    	(setq znach (entget (ssname spisok i))) ;создание списка для очередного примитива
    	(setq q2 (nth 3 (assoc 10 znach))) ;считывание значения Z примитива
    	(setq rez (atof (rtos (* (- q2 otm_pr) scale_otk) 2 0))) ;вычисление отклонения
    	(setq q1 (cons 1
      (if (< rez 0) ;добавление "+" для положительного значения и "±" для "0"
     
    	 (rtos rez 2 0)
    	 (if (= rez 0)
    	   "±0"
    	   (strcat "+" (rtos rez 2 0))
    	 )
       )
    	 )
    	)
    	(setq znach (subst q1 (assoc 1 znach) znach))
    	(entmod znach)
    	(setq i (1+ i))
      )
    )
     
    Последнее редактирование: 31 окт 2014
    Qvinto нравится это.
  12. Qvinto

    Qvinto Форумчанин

    mihamster нравится это.
  13. mihamster

    mihamster Форумчанин

    Я на этот сайт уже тоже попадал.. но что то там пока для меня слишком сложные вещи..)
     
  14. mihamster

    mihamster Форумчанин

    в процессе модернизации программки встрял на одной проблемке.
    сейчас в файле лиспа несколько функций; основная (типа контекстного меню) и еще несколько, которые вызываются из него, одна - непосредственно для расчетов, а остальные для задания исходных данных.

    все записаны через (defun <название> (/) <тело>)

    при завершении обработки, получается корявый выход:
    - *прервано*
    - команда: nil

    (princ) не помогает.. после него все равно идет прерывание.

    раньше когда все было в одной функции, выход был нормальный.

    "nil" это я так понимаю идет возвращение значения (defun)... потому что если поменять на (defun-q), вместо nil, возвращается первый аргумент.

    последняя функция (раскрыть)

    Код:
    (defun viborka_otkl (/ i q1 q2 spisok znach txt_found)
      (setq spisok (ssget '((0 . "*text"))))
      (setq i 0)
      (while (< i (sslength spisok))
    	(setq znach (entget (ssname spisok i)))
    	(setq q2 (nth 3 (assoc 10 znach)))
    	(setq rez (atof (rtos (* (- q2 otm_pr) scale-otkl) 2 0)))
    	(setq q1 (cons 1
    		   (if (< rez 0)
    			 (rtos rez 2 0)
    			 (if (= rez 0)
    			   "±0"
    			   (strcat "+" (rtos rez 2 0))
    			 )
    		   )
    		 )
    	)
    	(if	(or (< rez min-dopusk) (> rez max-dopusk))
    	  (setq znach (if (setq txt_found (assoc 62 znach))
    			(subst '(62 . 1) txt_found znach)
    			(append znach '((62 . 1)))
    		  )
    	  )
    	  (setq znach (if (setq txt_found (assoc 62 znach))
    			(subst '(62 . 2) txt_found znach)
    			(append znach '((62 . 2)))
    		  )
    	  )
    	)
    	(setq znach (subst q1 (assoc 1 znach) znach))
    	(entmod znach)
    	(setq i (1+ i))
      )
    (princ)
    )
    заранее задать otm_pr, scale-otkl, min-,max-dopusk
     
  15. mihamster

    mihamster Форумчанин

    Подскажите пожалуйста еще момент..
    Содаем, например мультивыноску, кодом..
    Как эту созданую выноску выделить, включить ручки я представляю.. а можно как нибудь "схватиться" за нужную ручку? Чтобы например положение подправить?
     
  16. BearDyugin

    BearDyugin Модератор Форумчанин

    Если совсем просто, то командным методом и в процессе создания, можно разрешить указывать например положение полки пользователю.
    Если совсем сложно, то через реакторы, не за ручку выноску тянуть, а отслеживать положение курсора и перестраивать выноску под него
     
    mihamster нравится это.
  17. mihamster

    mihamster Форумчанин

    Направте пожалуйста еще.

    Есть надобность создать функцию с переменным числом параметров. (Например, как штатная фун. (+ [пер1] [пер2]... перN))

    В изначальном lisp есть описание для переменных - &rest.. но это не работает в автолиспе... либо я как то неправильно использую его.. (хотя врядли, потму что копировал, прям с примера)
     
  18. BearDyugin

    BearDyugin Модератор Форумчанин

    Делаешь один параметр, в который передаешь список, а уже в список засовываешь любое переменное количество параметров.
    Ну или пример приведи.
     
  19. mihamster

    mihamster Форумчанин

    Точный код не скажу, сейчас нет под рукой ни компа, ни файла.

    Но смысл такой.
    Есть функция, в теле которой несколько других функций. При определенных условиях, необходимо группе переменных присвоить одно и тоже значение. При этом определение группы в каждой функции разное.
    Как то так.

    Если бы работал рест, я бы написал как то так:
    Код:
    (defun fun0 (a &rest varN / )
    (setq varN a)
    )
     
  20. BearDyugin

    BearDyugin Модератор Форумчанин

    Всё равно не понятно
    ну давай теперь разные примеры вызова этой функции и какой по твоей(или &rest) логике они вернут результат.
     
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление