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

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

Помогите найти решение

Ответ
Поиск в этой теме
Непрочитано 26.02.2006, 12:59 #1
Помогите найти решение
CB
 
Конструирование в области нефтеразведки
 
Гомель
Регистрация: 10.02.2006
Сообщений: 321

Честно скажу – сложно сформулировать вопрос, но попробую. Небольшой экскурс по проблеме.
Задача состоит в переводе DOS-овских чертежей, в которых коды шрифтов не совпадают
с Windows. Задачу перевода текста, блоков и attdef решил, остались размеры.
Пример:
(setq txt_win ‘(49 52 46 50 53 130 128 131 130 128 130 131 130 43 48 46 50 52))
; избавляемся от спецсимволов, формирующих размер с допуском
(foreach X '(128 129 130 131 32) (setq txt_win (vl-remove X txt_win)))
(49 52 46 50 53 43 48 46 50 52)
(mapcar ' (lambda(X) (vl-list-length (vl-remove-if-not '(lambda (Y)
(equal Y X)) txt_win)) ) '(43 45) )
(1 0) ; комбинация для плюсов(43) и минусов(45)
Дальше не знаю в каком направлении двигаться, ведь таких комбинаций может быть 6:
(0 0), (1 0), (2 0).(0 1), (0 2), (1 1). Надо иметь 3 переменные, чтобы
изменить код ‘1 в списке размерого примитива
(setq txt_win (strcat "\\A1;" NOM "{\\H0.5x;\\S" DV "^" DN ";}").
C чем лучше работать со списками или с текстом
Просмотров: 4082
 
Непрочитано 26.02.2006, 13:27
#2
Fogel

люблю мастерить
 
Регистрация: 21.01.2005
Челябинск
Сообщений: 10,332


Может всеж проще готовый конвертор? У мя валяется (WNEWCP MFC Application) 200кил, надо, так закину...
Fogel вне форума  
 
Непрочитано 26.02.2006, 13:42
#3
{Smirnoff}

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


Вот есть готовая программа http://www.autocad.ru/cgi-bin/f1/board.cgi?t=20297rW .
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 26.02.2006, 14:19
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Если честно то сомневаюсь что готовая программа поможет(хотя надо попробовать). Ведь в новом шрифте нет тех спецкодов которые
были в DOS-овском шрифте и текст будет выглядеть как
14??????+0.2. и какпрограмме "объяснить" что к примеру
DOSовкой букве "Г" соответствует Windowская "К"?
Пришлось самому писать таблицу соответствия кодов (DOS . WIN)
CB вне форума  
 
Автор темы   Непрочитано 26.02.2006, 15:12
#5
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Может я не очень правильно поставил вопрос - мне нужен не конвертер, нужно например список
(49 52 46 50 53 43 48 46 50 52) разбить на
((49 52 46 50 53 ) (43 48 46 50 52) nil) или
(49 52 46 50 53 43 48 46 50 52 43 48 46 50) разбить на
((49 52 46 50 53 ) (43 48 46 50 52) (43 48 46 50)) или
(49 52 46 50 53) разбить на ((49 52 46 50 53) nil nil)
Условие разбивки наличие 43 или 45.
И еще я не определился что лучше - разбивать список или
(vl-list->string список) т.е текст.
CB вне форума  
 
Непрочитано 27.02.2006, 20:47
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>CB
Решил и в этой ветке оветить, вроде тебе понравилось иметь дело с рекурсиями
Код:
[Выделить все]
(defun trim_43_45 (lst tmp)
  (cond
    ((null lst) (if tmp (list (reverse tmp))))
    ((and (/= (car lst) 43) (/= (car lst) 45))
     (trim_43_45 (cdr lst) (cons (car lst) tmp))
     )
    (t (cons (reverse tmp) (trim_43_45 (cdr lst) (list (car lst)))))
  )
)
Проверка:
Код:
[Выделить все]
(trim_43_45 '(49 52 46 50 53 43 48 46 50 52) nil)
;=> ((49 52 46 50 53) (43 48 46 50 52))

(trim_43_45 '(49 52 46 50 53 43 48 46 50 52 43 48 46 50) nil)
;=> ((49 52 46 50 53) (43 48 46 50 52) (43 48 46 50))

(trim_43_45 '(49 52 46 50 53) nil)
;=> ((49 52 46 50 53))
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.02.2006, 10:18
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Это конечно то что нужно, но требует серьезного осмысления.
Пока очень сложно для понимания, ведь я хотел идти другим путем, попроще. Буду разбираться с рекурсией функции.
Спасибо Евгений.
CB вне форума  
 
Непрочитано 28.02.2006, 10:28
#8
C1


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


Не уверен что это Вам поможет, но я подобное делаю в Wordе. Можно и макросом. Заменой. "43" -> ")(43"
Конец строки сочетание символов ^p.
C1 вне форума  
 
Непрочитано 28.02.2006, 13:02
#9
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>CB
Если нужна простая замена 43<=>45 то это можно решить гараздо проще...
Если интересно - спрашивайте
Елпанов Евгений вне форума  
 
Непрочитано 28.02.2006, 15:05
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Решил помочь твоему горю...
Код:
[Выделить все]
;|**************** multi-subst.lsp **************************
;	Библиотечная функция
;	множественной замены одних элементов списка
;	на другие.
;	Функция применима во всех случаях, когда возможна
;	проверка на соответствие через "EQUAL"
;	Автор  Евгений Елпанов.
;***********************************************************
;   Аргументы:
;	lst — список, в котором необходимо произвести замены
;	lst-i — соответствий ((заменяемое заменитель) ...())
;***********************************************************
;	Пример вызова
;	(multi-subst '(1 2 3 4 5) '((1 "a") (3 "b")))
;	функция вернет ("a" 2 "b" 4 5)
|;
(defun multi-subst (lst lst-i)
  (eval
    (list
      (function mapcar)
      (list
	(function function)
	(list
	  (function lambda)
	  '(a)
	  (cons
	    (function cond)
	    (reverse
	      (cons
		'(t a)
		(reverse
		  (mapcar
		    (function
		      (lambda (a)
			(list
			  (list
			    (function equal)
			    (car a)
			    'a
			  ) ;_  list
			  (cadr a)
			) ;_  list
		      ) ;_  lambda
		    ) ;_  function
		    lst-i
		  ) ;_  mapcar
		) ;_  reverse
	      ) ;_  cons
	    ) ;_  reverse
	  ) ;_  cons
	) ;_  cons
      ) ;_  list
      'lst
    ) ;_  list
  ) ;_  eval
) ;_  defun
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.02.2006, 17:08
#11
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да нет же Евгений! Тот код, который с рекурсией как раз то, что нужно. Уже продолжил работу над программой, на которой заткнулся, используя этот код. В принципе я эту задачу уже решал раньше, правда через... и хотелось посмотреть как работают профи. (Вывод - как еще долго идти к мастерству). А за эту программу спасибо, может пригодится где.
Спасибо за помощь, если что, буду спрашивать еще.
CB вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите найти решение