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

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

Ода проводам

Ответ
Поиск в этой теме
Непрочитано 19.03.2010, 22:33 #1
Ода проводам
sdv79
 
Инженер ЭОМ
 
Москва
Регистрация: 05.03.2009
Сообщений: 215

По замечаниям Vova добавляю:
Программа получает входящие данные строка-тип провода, допускается ошибочное написание
типа проводника типа "ВВГнг - LS 3 x 2.5 - п.20" программа поправит по ГОСТ 21.608-84 и выдаст
"ВВГнг-LS 3х2,5-П20", при этом пользователь получает из структуры
Тип проводника
Сечение
Количество жил
Тип трубы
Диаметр трубы...
Еще она умеет замещать по желанию пользователя все данные:
Тип проводника
Сечение
Количество жил
Тип трубы
Диаметр трубы...

Код:
[Выделить все]
;;----------------------------------------------------
;;  Программа позволяет получить структуру каждого
;;  элемента кабеля а так же трубу и диаметр (при наличии)
;;  (c:Wire_structure "ВВГнг-LS 3х4"  nil nil nil nil nil nil nil)
;;  (c:Wire_structure "ВВГнг-LS 2х25+1х16"  nil nil nil nil nil nil nil)
;;  (c:Wire_structure "2-ВВГнг-LS 5(1x70)+1х70-П20" "3" "№3" "4" "2,5" "35" "Т" "40") или
;;  (c:Wire_structure (nth 13 znach_of_attributes) nil nil nil nil nil nil nil)
;;  вместо отсутствующим пишем nil
;;  Автор Дмитрий Сологубов
;;  Final 25.02.10
;;  [rev.01 от 14.03.10]
;;----------------------------------------------------

(defun c:Wire_structure
 (                       ; входящие переменные
   wire_list_entering_in ; вся запись проводника целиком "2-ВВГнг-LS 3x2,5-П20"
   wire_kol_in             ; кол проводников-первая цифра в структуре "2"
   number_group_in       ; # группы "№3"
   kol_jil_in             ; кол жил "3"
   wire_section_in       ; сечение проводника 2,5
   wire_section_2_in     ; второе сечение после "+1х" т.е "35"
   pipe_text_in          ; тип трубы "П"
   pipe_diametr_in       ; диаметр трубы "20"
  
  /                      ; локальные и выходящие переменные
  
   wire_list_entering
   wire_list
  ;control_out           ; проверка на соответствие записи структуры проводника ГОСТ 21.608-84
  ;wire_kol_out          ; кол. проводников "2" в "2-ВВГн..."
  ;wire_kol_tire_out     ; тире после "2" в "2-ВВГн..."
;;;   wire_[x1           ; в проводе "(1х"
;;;   wire_]             ; в проводе ")"
   wire_marka_list
  ;kol_jil_out           ; количество жил "3"
  ;wire_marka_out        ; марка "ВВГнг-LS"
  ;wire_section_out      ; сечение "2,5"
   wire_section_list
   wire_section_list_del
  ;pluse_out              ; "+1х"
  ;wire_section_2_out    ; второе сечение после "+1х" т.е "35"
   pipe_d_list
   counter
   pipe_d_list_next
   pipe_d
  ;pipe_text_out         ; тип трубы "П"
  ;pipe_diametr_out      ; диаметр трубы "20"
  ;wire_cool_out         ; "2-ВВГнг-LS 3х2,5+1+1х35-П20"
 )

(vl-load-com)
  
(setq wire_list_entering (vl-string->list wire_list_entering_in) )
;;;  (if (= number_group nil) (alert "шухер ") ) 
   
 (foreach a (reverse wire_list_entering) ; долой пробелы!!!
  (cond ((/= a 32) (setq wire_list (cons a wire_list) ) ) )
 ) ;/ foreach
 (cond ((member 46 wire_list) (setq wire_list (subst 44 46 wire_list) ) ) ) ; меняешь "." на "," 

 (cond ; мы не расисты, но нам нужны наши "х"
  ((member 88 wire_list) (setq wire_list (subst 245 88 wire_list) ) ) 
  ((member 120 wire_list) (setq wire_list (subst 245 120 wire_list) ) ) 
  ((member 213 wire_list) (setq wire_list (subst 245 213 wire_list) ) ) 
 ) ;/ cond
 (cond ((member 65 wire_list) (setq wire_list (subst 192 65 wire_list) ) ) ) ; и наши "А"

 (setq control_out (cddddr (member 245 wire_list) ) )
 (cond ((member 44 control_out) (setq control_out T) ) )

 (if (/= wire_kol_in nil)
  (progn ; [!]
   (setq wire_kol_out wire_kol_in
         wire_kol_tire_out "-")
  ) ;/ progn
  (progn ; [!!]
   (setq wire_kol_out ""
         wire_kol_tire_out "")
   (cond
    ((and (> (car wire_list) 48) (< (car wire_list) 57) ) ; "0" код 48.."9" код 57
     (setq wire_kol_out (vl-list->string (list (car wire_list) ) )
       wire_kol_tire_out "-")
   )) ;/ cond
  ) ;/ progn
 ) ;/ if
   
 (if (/= (member 40 wire_list) nil); "(" код 40
  (progn ; [!]
   (setq wire_[x1 "(1х"
         wire_] ")"
         wire_marka_list (c:member_back_to_front 40 wire_list) ; "(" код 40
         kol_jil_out (vl-list->string (list (last wire_marka_list) ) ) )
   
   (if (= (car (cdr wire_marka_list)) 45) ; "-" код 45? т.е 2-
    (setq wire_marka_out (vl-list->string
     (cdr (member 45 (reverse (cdr (reverse wire_marka_list) ) ) ) ) ) ) ; [!]
    (if (= (member 45 wire_marka_list) ) ; [!!] ВВГнг-LS
     (setq wire_marka_out (vl-list->string (reverse (cdr (reverse wire_marka_list) ) ) ) ) ; [!]
     (setq wire_marka_out (vl-list->string
     (reverse (cdr (reverse (cdr (member 45 wire_marka_list) ) ) ) ) ) ) ; [!!]
    ) ;/ if
   ) ;/ if
   (setq wire_section_out (vl-list->string (c:member_back_to_front 41 (cdr (member 245 wire_list) ) ) ) )
  ) ;/ progn
   
  (progn ; [!!]
   (setq wire_[x1 "х"
        wire_] "" 
       wire_marka_list (c:member_back_to_front 245 wire_list) 
        kol_jil_out (vl-list->string (list (last wire_marka_list) ) ) )

   (if (= (car (cdr wire_marka_list)) 45) ; "-" код 45? т.е 2-
    (setq wire_marka_out(vl-list->string (cdr(member 45(reverse(cdr(reverse wire_marka_list))))))) ; [!]
    (if (= (member 45 wire_marka_list) ) ; [!!] ВВГнг-LS
     (setq wire_marka_out (vl-list->string (reverse (cdr (reverse wire_marka_list) ) ) ) ) ; [!]
     (setq wire_marka_out
      (vl-list->string (reverse (cdr (reverse (cdr (member 45 wire_marka_list) ) ) ) ) ) ) ; [!!]
   ) ;/ if
  ) ;/ if

   (setq wire_section_list (subst 245 45 (cdr (member 245 wire_list) ) ) ) ;"2,5п,20" (50 44 53 239 44 50 48)
   (if (> (length wire_section_list) 3)
    (progn ; [!]
     (setq wire_section_list (subst 64 43 wire_section_list))
     (while (< (car wire_section_list) 58)
      (setq wire_section_list_del (cons (car wire_section_list) wire_section_list_del)
              wire_section_list (cdr wire_section_list) )
     ) ;/ while
     (setq wire_section_out (vl-list->string (reverse wire_section_list_del) )
           wire_section_list_del nil)
    ) ;/ progn
    (setq wire_section_out (vl-list->string wire_section_list) ) ; [!!]
   ) ;/ if
    
  ) ;/ progn
 ) ;/ if
 (setq wire_marka_list nil
       pluse_out ""
       wire_section_2_out "")
 (cond
  ((member 43 wire_list) ; "+" код 43
   (setq pluse_out "+1х")
    (foreach b (reverse (member 43 wire_list))
     (cond ((and (>= b 47) (<= b 57)) (setq wire_section_2_list (cons b wire_section_2_list) ) ) )
    ) ;/ foreach
   (setq wire_section_2_out
    (vl-list->string (list (car (cdr wire_section_2_list )) (car (cddr wire_section_2_list ) ) ) ) )     
   (setq wire_section_2_list nil)
 )) ;/ cond

 ;----------------------------------------------------начало трубы 
 (foreach b wire_list
  (cond ((or (and (>= b 48) (<= b 57)) (and (>= b 65) (<= b 255) ) )
   (setq pipe_d_list (cons b pipe_d_list) )
  )) ;/ cond
 ) ;/ foreach
 (setq wire_list nil
       counter 4)
 (while (/= counter 0)
  (setq counter (1- counter)
        pipe_d_list_next (cons (car pipe_d_list) pipe_d_list_next)
        pipe_d_list (cdr pipe_d_list ) )
 )
 (setq pipe_d_list_next (strcase (vl-list->string pipe_d_list_next))
       pipe_d_list nil)
;;;       pipe_d_list_next nil)

  
 (setq pipe_text_out ""
       pipe_diametr_out "")
   
 (cond
  ((wcmatch pipe_d_list_next "*П*")
   (setq    pipe_text_out "П"
            pipe_diametr_out(vl-list->string (cdr(member 207(vl-string->list pipe_d_list_next))))))

  ((wcmatch pipe_d_list_next "*Т*")
   (setq    pipe_text_out "Т"
            pipe_diametr_out(vl-list->string (cdr(member 210(vl-string->list pipe_d_list_next))))))

  ((wcmatch pipe_d_list_next "*Г*")
   (setq    pipe_text_out "Г"
            pipe_diametr_out(vl-list->string (cdr(member 195(vl-string->list pipe_d_list_next))))))
     
 ) ;/ cond
 (setq pipe_d_list_next nil) 

 (cond ((/= kol_jil_in nil)        (setq kol_jil_out kol_jil_in) ) )
 (cond ((/= wire_section_in nil)   (setq wire_section_out wire_section_in) ) )
 (cond ((/= wire_section_2_in nil) (setq wire_section_2_out wire_section_2_in) ) )
 (cond ((/= pipe_text_in nil)      (setq pipe_text_out  pipe_text_in) ) )
 (cond ((/= pipe_diametr_in nil)   (setq pipe_diametr_out pipe_diametr_in) ) )
  
 (if (= pipe_text_out "")
  (setq wire_cool_out (strcat wire_kol_out wire_kol_tire_out wire_marka_out" "
                  kol_jil_out wire_[x1 wire_section_out wire_]
                              pluse_out wire_section_2_out)) ; [!]
  (setq wire_cool_out (strcat wire_kol_out wire_kol_tire_out wire_marka_out" "
                  kol_jil_out wire_[x1 wire_section_out wire_]
                              pluse_out wire_section_2_out "-"
                  pipe_text_out pipe_diametr_out)) ; [!!] для трубы
 ) ;/ if
 
) ; / defun

;;; для тестирования если у пользователя вдруг возникнет бага
;;; (setq wire_list_entering (vl-string->list "ВВГнг-LS 3х6") )
;;; (setq wire_list_entering (vl-string->list "ВВГнг-LS 2х25+1х16") )
;;; (setq wire_list_entering (vl-string->list "ВВГнг-LS 3х2.5") )
;;; (setq wire_list_entering (vl-string->list "ВВГнг-LS 3х10-Г25") )
;;; (setq wire_list_entering (vl-string->list "   ВВГнг - LS 3  x 2.5 -  п.20 ") ) 
;;; (setq wire_list_entering (vl-string->list "   ВВГнг - LS 3  x 2.5 - п20 ") ) 
;;; (setq wire_list_entering (vl-string->list  "   ВВГнг - LS 3  х 2.5  ") ) 
;;;;;;
;;; (setq wire_list_entering (vl-string->list "   2 - АПВ1 3(1х2.5) - п.20  ") )
;;; (setq wire_list_entering (vl-string->list "   2 - АПВ1 3(1х2.5) - п20  ") )
;;; (setq wire_list_entering (vl-string->list "   2 - ВВГнг - LS 3(1х2.5) - п.20  ") )
;;; (setq wire_list_entering (vl-string->list "   АПВ1 3(1х2.5) - п.20  ") ) ;+
;;; (setq wire_list_entering (vl-string->list "   ВВГнг - LS 3 ( 1 x 2.5 ) ") ) ;+
;;; (setq wire_list_entering (vl-string->list "   ВВГнг - LS 3 ( 1 x 2.5 ) - п.20 ") ) 
;;; (setq wire_list_entering (vl-string->list "   ВВГнг - LS 3 ( 1 x 2.5 ) + 1 x 35 ") )

Последний раз редактировалось sdv79, 20.03.2010 в 15:37.
Просмотров: 2958
 
Непрочитано 20.03.2010, 00:00
#2
Кулик Алексей aka kpblc
Moderator

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


sdv79, а правила форума прочитаны? И в чем, собственно, вопрос?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.03.2010, 12:59
#3
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Хотел поделиться программкой, но не совсем уверен в ее работоспособности и грамотности кода. Если считаете нецелесообразным, удаляйте.
)))
sdv79 вне форума  
 
Непрочитано 20.03.2010, 13:57
#4
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Так написал-бы, что она должна делать, и что получается (не совсем уверен в ее работоспособности). Вероятно, требуется тестирование в разных условиях, посему и надо описание.
Раз в названии темы присутствует слово ОДА, значит от программы ожидаются чудеса. Какие?
Vova вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ода проводам