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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сделать размеры кратыми 5 и 10, если они заданы текстом

Сделать размеры кратыми 5 и 10, если они заданы текстом

Ответ
Поиск в этой теме
Непрочитано 13.09.2018, 20:16 #1
Сделать размеры кратыми 5 и 10, если они заданы текстом
superkot007
 
Регистрация: 15.01.2010
Сообщений: 254

Имеется программная выгрузка изометрических чертежей трубопроводов ("изометрички"). Изометрички не имеют определенного масштаба, поэтому значения всех размеров указаны в "текстовой строке".
Необходимо сделать размеры кратными 5 (или 10). Размеры выгружаются с точностью до 1 (например, 3999), которые желательно округлить до "читаемых" значений (например, 4000).
Попытки найти готовый lisp для подобного округления успехом не увенчались. Если кто-то может написать lisp под описанную задачу (или имеет готовый) - помогите, пожалуйста. Или, если я таки пропустил готовый lisp - ткните носом...
Просмотров: 1348
 
Непрочитано 13.09.2018, 20:47
#2
Кулик Алексей aka kpblc
Moderator

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


Читаешь значение, округляешь с помощью кодов из http://forum.dwg.ru/showthread.php?p=301275 , потом устанавливаешь обратно - в чем трудность?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.09.2018, 22:33
#3
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
в чем трудность?
Трудность в том, что подобных размеров на каждом чертеже - десятки и неумении писать на LISP.
Нужен LISP, с помощью которого можно было бы выбрать требующие корректировки размеры и эти размеры автоматически округлялись.
Носом в функцию ткнул, спасибо, но
Цитата:
Сообщение от superkot007 Посмотреть сообщение
помогите, пожалуйста
superkot007 вне форума  
 
Непрочитано 13.09.2018, 22:40
#4
Кулик Алексей aka kpblc
Moderator

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


Тогда добро пожаловать в раздел "Поиск исполнителей"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.09.2018, 14:27
#5
superkot007


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


Спасибо, это задача не такого высокого уровня)

Cотворил-таки нужный lisp:
Код:
[Выделить все]
  (defun C:ROUND_DIMENSION_1 (/ val prec old_ortho old_snap old_osnap)
 ; ОКРУГЛЕНИЕ ТЕКСТОВЫХ РАЗМЕРОВ В ИЗОМЕТРИЧЕСКИХ ЧЕРТЕЖАХ

    ;Запомнить текущие состояния режимов ORTHO, SNAP и OSNAP
    (setq old_ortho (getvar "ORTHOMODE") old_snap (getvar "SNAPMODE") old_osnap (getvar "OSMODE"))
		  
	;Отключить режимы ORTHO, SNAP и OSNAP
    (setvar "ORTHOMODE" 0)
    (setvar "SNAPMODE" 0)
    (setvar "OSMODE" 0)
	
    (setq DIM_SELECT (ssget))
	(setq prec (getreal "Кратность округления:"))
	(defun round (val prec)(* (fix (+ (/ val (float prec)) 0.5)) prec))
	(setq i -1 nab_DIM (sslength DIM_SELECT))
	(while (< i nab_DIM)
        ; Цикл по количеству элементов набора DIM_SELECT
        (setq i (1+ i))
        ; Выбор следующего примитива и получение его списка
        (setq OLD (entget (ssname DIM_SELECT i)))
	    (setq NEW OLD)
	    (setq RAZMS (atoi (cdr (assoc 1 NEW))))
	    (setq NEW (subst (cons 1 (itoa (fix (round RAZMS prec))))(assoc 1 NEW) NEW))
        (entmod NEW)
    )
    ;Восстановить состояния режимов ORTHO, SNAP и OSNAP
    (setvar "ORTHOMODE" old_ortho)
    (setvar "SNAPMODE" old_snap)
    (setvar "OSMODE" old_osnap)
)
Но работа не совсем корректная:
- если все-таки требуется округлять нецелочисленные значения - округление происходит до целых значений; я понимаю, что всему виной функция fix в строке 24, но не получается ее убрать;
- после завершения работы (хотя округление более-менее срабатывает) выдает ошибку: "неверный тип аргумента: lentityp nil".
Может, хотя бы советы по оптимизации lisp бесплатны?)
superkot007 вне форума  
 
Непрочитано 14.09.2018, 16:10
#6
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Код:
[Выделить все]
 (defun C:ROUND_DIMENSION (/ ss prec entity NEW)
  (if (setq prec (getreal "Кратность округления:"))
    (if	(setq ss (ssget '((0 . "dim*"))))
      (foreach entity (ssnamex ss)
	(if (eq (type (cadr entity)) 'ENAME)
	  (progn
	  (setq	NEW (entget (cadr entity))
		NEW
		 (subst
		   (cons 1
			 (rtos 
			   (Kr_roundof
			   (atof (cdr (assoc 1 (entget (cadr entity)))))
			   prec
			 )
			   2 0)
		   )
		   (assoc 1 NEW)
		   NEW
		 )
	  )
	  (entmod NEW)
	  )
	)
      )
    )
  )
)

(defun Kr_roundof (num presc / )
(* (atof (rtos (/ num presc) 2 0)) presc)
  )
__________________
Делай хорошо, плохо само получится.

Последний раз редактировалось Krieger, 14.09.2018 в 16:41.
Krieger вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сделать размеры кратыми 5 и 10, если они заданы текстом

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Нужно ли делать под мауэрлат ж/б пояс, если предположить шарнирно-подвижное опирание стропил inzh.konstr Деревянные конструкции 14 02.08.2018 21:12
как из VLX сделать LSP если такое бывает Flint Программирование 3 15.09.2009 15:04
можно ли сделать постоянными параметры (размеры, текст, слои) Владимир Кереб AutoCAD 46 25.12.2008 16:08
что сделать чтобы в рамке А4 можно было задавать правильные размеры? Alannn AutoCAD 9 15.10.2008 22:54