Тема: Lisp Перенос текста в таблицу

Нужен лисп: нажимаешь кнопку ,выбираешь ячейку таблицы, далее начинаешь выбирать текстовые поля и содержимое текстовых полей копируется по порядку в ячейки таблицы. Данный лисп нужен для автоматизации получения кабельного журнала. а точнее для столбцов от куда идет, и куда поступает.
Заранее благодарен...

Re: Lisp Перенос текста в таблицу

Переводи подсказки сам у меня проблемы с раскладкой в автокаде

;; exhausted by fixo
(defun C:journal (/ col en grkw next pick row stxt tbl txt vec  xdir ydir zdir)
 
;; local function by gile
(defun CrossProduct (v1 v2)
  (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  )
)
  
  ;;  -------------------   main part   ---------------------;;
  (princ "\nSelect a table:")
  (while (not tbl)
    (if    (setq en (entsel "\n   ---   Select a table:   ---"))
      (progn
    (setq tbl (vlax-ename->vla-object (car en)))
    (if (not (eq "AcDbTable" (vla-get-ObjectName tbl)))
      (progn
        (princ "Object selected is not a table.")
        (setq tbl nil)
      )
    )
      )
      (princ "Nothing selected.")
    )
  )
  
  (initget "Row Column")
  (setq grkw (getint
         (strcat
           "\nChoose filling mode by [Row/Column]: <Row>"
          )
           )
      )
       (if (not grkw)
     
    (setq  grkw "Row");;<-- in this case get default value
      )

         (setq pick (getpoint "\nPick inside the starting cell: "))  
             (setq xdir    (getvar "ucsxdir")
               ydir    (getvar "ucsydir")
               zdir    (CrossProduct xdir ydir))


             (setq vec (vlax-make-variant
                 (vlax-safearray-fill
                   (vlax-make-safearray vlax-vbDouble '(0 . 2))
                   zdir))
               );<-- equal to :(setq vec (vlax-3d-point zdir))
  (if (eq :vlax-true
                 (vla-hittest
                   tbl
                   (vlax-3d-point (trans pick 1 0))
                   vec
                   'row
                   'col));<-- by reference

               (vla-setsubselection tbl row row col col);<--highlight picked cell

               )
  (if (eq "Row" grkw)(progn
  (princ "\n   ---   Select a text/mtext one by one:   ---")
  (setq next T)
  (while (and next (setq stxt (ssget "+.:S:E:L" (list (cons 0 "*text")))))
    (setq txt (cdr (assoc 1 (entget (ssname stxt 0)))))
   (if (not (vl-catch-all-error-p      
        (vl-catch-all-apply 'vla-settext (list tbl row col txt)))
      )

    (progn
    (vla-setsubselection tbl row row col col)
    (setq row (1+ row)))
     (progn
     (alert "End is reached")
     (setq next nil))))
  ))
  (if (eq "Column" grkw)(progn
  (princ "\n   ---   Select a text/mtext one by one:   ---")
  (setq next T)
  (while (and next (setq stxt (ssget "+.:S:E:L" (list (cons 0 "*text")))))
    (setq txt (cdr (assoc 1 (entget (ssname stxt 0)))))
   (if (not (vl-catch-all-error-p      
        (vl-catch-all-apply 'vla-settext (list tbl row col txt)))
      )

    (progn
    (vla-setsubselection tbl row row col col)
    (setq col (1+ col)))
     (progn
     (alert "End is reached")
     (setq next nil))))
  ))
  (vla-update tbl)
  (vlax-release-object tbl)
  (princ)
)
(prompt "\n   ---   Start command with \"JOURNAL\"   ---")
(prin1)
(vl-load-com)
(princ)

Re: Lisp Перенос текста в таблицу

Скажите а можно чтоб сначало значение копировалось в ячейку потом следующее в соседнюю правую потом следующее в ячейке под первым значением, следующее в ячейке под вторым и так далее..

Re: Lisp Перенос текста в таблицу

Здравствуйте!!! Очень актуальная тема!!! Но, к сожалению во время попытки ввода получил следующее:
Select a table:
   ---   Select a table:   ---
Choose filling mode by [Row/Column]: <Row>
Pick inside the starting cell:
   ---   Select a text/mtext one by one:   ---; ошибка: неверная строка режима
ssget
Может я что-то делаю не так? (AutoCAD 2012) :?:

Re: Lisp Перенос текста в таблицу

flareon пишет:

--- Select a text/mtext one by one: ---; ошибка: неверная строка режима

Попробуй изменить строчку :

(while (and next (setq stxt (ssget "+.:S:E:L" (list (cons 0 "*text")))))

на

(while (and next (setq stxt (ssget "_:S" (list (cons 0 "text,mtext")))))

(изменено: fixo, 25 января 2012г. 23:48:11)

Re: Lisp Перенос текста в таблицу

Андрей antiponf пишет:

Скажите а можно чтоб сначало значение копировалось в ячейку потом следующее в соседнюю правую потом следующее в ячейке под первым значением, следующее в ячейке под вторым и так далее..

Тогда собирай парами объекты в список пар или
список списков и потом заполняй таблицу этим списком:

;;---------------------------------------------------------;;

;; exhausted by fixo
;; edited 1/26/12   
(defun C:demo (/ cnt col data dirty en next pick row stxt tbl txt vec  xdir ydir zdir)
 
;; local function by gile
(defun CrossProduct (v1 v2)
  (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  )
)
  
  ;;  -------------------   main part   ---------------------;;

  (while (not tbl)
    (if    (setq en (entsel "\nВыбрать таблицу:"))
      (progn
    (setq tbl (vlax-ename->vla-object (car en)))
    (if (not (eq "AcDbTable" (vla-get-ObjectName tbl)))
      (progn
        (princ "Выбранный объект не таблица.")
        (setq tbl nil)
      )
    )
      )
      (princ "Ничего не выбрано.")
    )
  )


         (setq pick (getpoint "\nУказать точку внутри ячейки: "))  
             (setq xdir    (getvar "ucsxdir")
               ydir    (getvar "ucsydir")
               zdir    (CrossProduct xdir ydir))


             (setq vec (vlax-make-variant
                 (vlax-safearray-fill
                   (vlax-make-safearray vlax-vbDouble '(0 . 2))
                   zdir))
               )
  (if (eq :vlax-true
                 (vla-hittest
                   tbl
                   (vlax-3d-point (trans pick 1 0))
                   vec
                   'row
                   'col))

               (vla-setsubselection tbl row row col col)

               )

  (princ "\n   ---   Выбрать тексты по одному попарно:   ---")
  (setq next T)
  (while (and next (setq stxt (ssget "_:S" (list (cons 0 "*text")))))
    (setq txt (cdr (assoc 1 (entget (ssname stxt 0)))))
    (setq dirty (cons txt dirty))
    )
  (if (/= 0(rem (length dirty) 2))
    (progn
      (alert "Число выбранных текстов не кратно двум. Отбой...")
      (exit)
      (princ)
      )
    )
    (setq dirty (reverse dirty)
      data nil)
 
  (while (cadr dirty)
    (setq data (append (list (list (car dirty) (cadr dirty))) data))
    (setq dirty (cddr dirty))
  )
  
  (setq data (reverse data))
  
 (setq cnt col)
  
  (foreach item data
    (setq col cnt)
    (vl-catch-all-apply 'vla-settext (list tbl row col (car item)))
    
    (setq col (1+ col))
   (vl-catch-all-apply 'vla-settext (list tbl row col (cadr item)))
    
    (setq row (1+ row))
    )
   (vl-catch-all-apply 'vla-clearsubselection (list tbl))
  (vla-update tbl)
  (vlax-release-object tbl)
  (princ)
)
(prompt "\n   ---   команда на выполнение \"DEMO\"   ---")
(prin1)
(or (vl-load-com)
(princ)    )
;;---------------------------------------------------------;;

Re: Lisp Перенос текста в таблицу

Строку в коде поменял, сохранил, подгрузил...Выдает то же самое :(

Re: Lisp Перенос текста в таблицу

flareon пишет:

Строку в коде поменял, сохранил, подгрузил...Выдает то же самое

Ничего не могу сказать, у меня в 2010(eng) Win 7 все работает

Re: Lisp Перенос текста в таблицу

Попробовал подгрузить лисп DEMO, все работает на "ура"! Подгружал так же... в AutoCAD 2012 rus на Win 7...блин...жаль... :cry:

Re: Lisp Перенос текста в таблицу

Скажите, а можете сделать что бы не парами заполнялись а по три ячейки каждой строки. то есть в строке на одну ячейку больше. Заранее благодарен

Re: Lisp Перенос текста в таблицу

Андрей antiponf пишет:

Скажите, а можете сделать что бы не парами заполнялись а по три ячейки каждой строки. то есть в строке на одну ячейку больше. Заранее благодарен

В сад  :!:

Re: Lisp Перенос текста в таблицу

fixo пишет:
Андрей antiponf пишет:

Скажите, а можете сделать что бы не парами заполнялись а по три ячейки каждой строки. то есть в строке на одну ячейку больше. Заранее благодарен

В сад

Простите не понял..?

Re: Lisp Перенос текста в таблицу

Андрей antiponf пишет:

Простите не понял..?

Извини, я не могу тратить столько времени , когда
не могут толком сформулировать вопрос, потом ты спросишь как
копировать текст по 4, по 5 , по диагонали, потом снизу вверх?
У меня свои проблемы, больше времени на это нет
Просто бери за основу последний код и группируй список
по сколько значений в строке тебе нужно
Навскидку без проверок (дальше делай сам)

;;---------------------------------------------------------;;

;; exhausted by fixo
;; edited 1/26/12   
(defun C:demo3 (/ cnt col data dirty en next pick row stxt tbl txt vec  xdir ydir zdir)
 
;; local function by gile
(defun CrossProduct (v1 v2)
  (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  )
)
  
  ;;  -------------------   main part   ---------------------;;

  (while (not tbl)
    (if    (setq en (entsel "\nВыбрать таблицу:"))
      (progn
    (setq tbl (vlax-ename->vla-object (car en)))
    (if (not (eq "AcDbTable" (vla-get-ObjectName tbl)))
      (progn
        (princ "Выбранный объект не таблица.")
        (setq tbl nil)
      )
    )
      )
      (princ "Ничего не выбрано.")
    )
  )


         (setq pick (getpoint "\nУказать точку внутри ячейки: "))  
             (setq xdir    (getvar "ucsxdir")
               ydir    (getvar "ucsydir")
               zdir    (CrossProduct xdir ydir))


             (setq vec (vlax-make-variant
                 (vlax-safearray-fill
                   (vlax-make-safearray vlax-vbDouble '(0 . 2))
                   zdir))
               )
  (if (eq :vlax-true
                 (vla-hittest
                   tbl
                   (vlax-3d-point (trans pick 1 0))
                   vec
                   'row
                   'col))

               (vla-setsubselection tbl row row col col)

               )

  (princ "\n   ---   Выбрать тексты отдельно по три на строчку:   ---")
  (setq next T)
  (while (and next (setq stxt (ssget "_:S" (list (cons 0 "*text")))))
    (setq txt (cdr (assoc 1 (entget (ssname stxt 0)))))
    (setq dirty (cons txt dirty))
    )
  (if (/= 0(rem (length dirty) 3))
    (progn
      (alert "Число выбранных текстов не кратно трём Отбой...")
      (exit)
      (princ)
      )
    )
    (setq dirty (reverse dirty)
      data nil)
 
  (while (cadr dirty)
    (setq data (append (list (list (car dirty) (cadr dirty)(caddr dirty))) data))
    (setq dirty (cdddr dirty))
  )
  
  (setq data (reverse data))
  
 (setq cnt col)
  
  (foreach item data
    (setq col cnt)
    (vl-catch-all-apply 'vla-settext (list tbl row col (car item)))    
    (setq col (1+ col))
   (vl-catch-all-apply 'vla-settext (list tbl row col (cadr item)))
        (setq col (1+ col))
   (vl-catch-all-apply 'vla-settext (list tbl row col (caddr item)))
    (setq row (1+ row))
    )
   (vl-catch-all-apply 'vla-clearsubselection (list tbl))
  (vla-update tbl)
  (vlax-release-object tbl)
  (princ)
)
(prompt "\n   ---   команда на выполнение \"DEMO\"   ---")
(prin1)
(or (vl-load-com)
(princ)    )


;;---------------------------------------------------------;;

Re: Lisp Перенос текста в таблицу

fixo, доброго времени! Попробовал на работе (там ZW 2008-eng на XP) все три кода работают отлично! Спасибо за помощь :D ! Я вообще случайно нарвался на ваш диалог :oops: , извиняюсь что влез ;) ! Всего доброго!!!

Re: Lisp Перенос текста в таблицу

@flareon,
Конечно рад если помог, а то на фига я здесь нужен :)
просто сильно занят со своими делами
Успехов :)

Re: Lisp Перенос текста в таблицу

fixo пишет:
Андрей antiponf пишет:

Скажите а можно чтоб сначало значение копировалось в ячейку потом следующее в соседнюю правую потом следующее в ячейке под первым значением, следующее в ячейке под вторым и так далее..

Тогда собирай парами объекты в список пар или
список списков и потом заполняй таблицу этим списком:

Здравствуйте.
А как можно сделать, чтобы данный лисп брал информацию не из текста, а из первого атрибута указанного динамического блока?