Тема: Перенос из содержания текста в координату z рядом стоящей точки

Господа, дорый день! Помнится, вроде натыкался я на програмку, которая позваляла делать следующее, напрмер стоит у нас пикет, который представляет из себя точку и надпись отметки (текст), так вот эти объекты без отметки уровня высоты, как то вроде было возможно взять текст из графы содержания и перенести в отметку z, именно находящейся рядом точки. Вот сейчас понадобилось мне данное действие, а программку найти не могу, но точно помню что где то про неё читал, кто нить может помочь в нахождении? Заранее спасибо!

Re: Перенос из содержания текста в координату z рядом стоящей точки

Как правило точки наблюдения это блоки.Если что не так, рамкой их выбрал и они сидят на своей высоте. А у вас как определить принадлежность текста точке. Или вы будете кликать ТЕКСТ, ТОЧКА. 1000 точек, 2000 кликов?

Re: Перенос из содержания текста в координату z рядом стоящей точки

Нет, просто высоты у точки нет! Нету координаты z ты это понимаешь? Есть пикет, у него нету координаты z у точки, есть только подпись высоты к этой точке текстовым файлом, мне нада, чтобы скажем, допустим, точка находится на расстоянии от текста в 20 см, утилита проверяет таке точки, и содержание текста переводит в координату z точки

Re: Перенос из содержания текста в координату z рядом стоящей точки

Кажется работает. Проверяет расстояние от POINT до точки вставки текста. Если меньше 20 см то меняет Z точки в соответствии с текстом. Это расстояние можно изменить в строке  (setq max_dist 0.2)

(defun c:p2h ( / nameset setlength i pntset k korpnt txtrun sp_txt dist
                 kortxt txtset pntlength txtlength pntrun sp_pnt
                 max_dist pk_pnt new_pk new_ps)
(setq max_dist 0.2)
(setq nameset (ssget "_:L" '(( 0 . "POINT,TEXT"))))
(setq setlength (sslength nameset)); dlina nabora
(setq pntset (ssadd))
(setq txtset (ssadd))
(setq i -1)
(repeat setlength
    (setq i (1+ i))
    (setq blcrun (ssname nameset i));imya tekushee
    (setq namrun (cdr (assoc 0 (entget blcrun)))) ;imya
       (cond
           ((eq namrun "POINT")(ssadd blcrun pntset)) ;dobavlyaem
           ((eq namrun "TEXT") (ssadd blcrun txtset)) ;dobavlyaem
       ) ;konec cond
) ;konec repeat
;;;;;;;;;;;;;;konec deleniya
(setq pntlength (sslength pntset)) ;dlina nabora
(setq txtlength (sslength txtset)) ;dlina nabora
(setq nameset nil) ;udalyaem nabor
;;;;;;;;;;;;;;
(setq i -1)
(repeat pntlength
  (setq i (1+ i))
  (setq pntrun (ssname pntset i)) ;imya tekushee
  (setq sp_pnt (entget pntrun)) ;spisok
  (setq pk_pnt (assoc 10 sp_pnt)) ;10,x,y,z
  (setq korpnt (reverse(cdr(reverse(cdr pk_pnt)))));
  (setq k -1)
  (repeat txtlength
    (setq k (1+ k))
    (setq txtrun (ssname txtset i)) ;imya tekushee
    (setq sp_txt (entget txtrun)) ;spisok
    (setq kortxt (reverse(cdr(reverse(cdr(assoc 10 sp_txt))))));
    (setq dist (distance korpnt kortxt))
    (if (< dist max_dist)
      (progn
      (setq h (atof(cdr(assoc 1 sp_txt))))
      (setq new_pk (append '(10) korpnt (list h)))
      (setq new_ps (subst new_pk pk_pnt sp_pnt)); zamena
      (entmod new_ps)
      (entupd  (cdr (assoc -1 new_ps)))
      ) ;progn
    ) ;if
   ) ;repeat
 ) ;repeat
(setq pntset nil) ;
(setq txtset nil) ;
)

Re: Перенос из содержания текста в координату z рядом стоящей точки

Запустил проверил - не работает, просит выбрать объекты выбираю и всё, операция прекращается? Как ты проверял? Может на каком слое определённом лежать должно? И ещё сразу вопрос, можно ли дописать в файлик, чтобы ещё запрашивалась дистанция а то не всегда 20 см, бывает и 40 и 45...

Re: Перенос из содержания текста в координату z рядом стоящей точки

Замени (setq max_dist 0.2)
на (setq max_dist (getreal "Distance? "))

Re: Перенос из содержания текста в координату z рядом стоящей точки

Беда в том, что при съемке могут натыкать столько пикетов, что сам не разберешься, не то что программа. Так что не обойтись без того, чтобы не тыкать текст - точка, и так 10000 раз.

Re: Перенос из содержания текста в координату z рядом стоящей точки

Всё прогрессивное человечество работает с блоками. Того, кто придумал точки с текстом нужно подвесить за одно место.

Re: Перенос из содержания текста в координату z рядом стоящей точки

А что было бы если были бы блоки?

Re: Перенос из содержания текста в координату z рядом стоящей точки

Эх, всё равно программа не запускается (((((

Re: Перенос из содержания текста в координату z рядом стоящей точки

Есть пикет, у него нету координаты z у точки, есть только подпись высоты к этой точке текстовым файлом, мне нада, чтобы скажем, допустим, точка находится на расстоянии от текста в 20 см, утилита проверяет таке точки, и содержание текста переводит в координату z точки

Подпись не может быть текстовым файлом. А вот текст может быть каким угодно - однострочным, многострочным, атрибутом, блоком с атрибутом...
Что значит "допустим"? И на расстоянии в каком направлении - вправо? Влево? Вверх? Вниз? По диагонали? Считать от точки вставки текста или от габарита прямоугольника, описанного вокруг текста? А если в указанных пределах несколько точек? А текст в каком формате нарисован: +0,656? Или, может, +0.656? Или 0,656? Или 0.656? А какое выравнивание текста (только влево или есть варианты)? А все объекты находятся в мировой системе координат или "перевернуты" как бог на душу положил?

Re: Перенос из содержания текста в координату z рядом стоящей точки

Всё правильно. Я предположил что имеется ввиду расстояние от POINT до точки вставки текста. Он даже сейчас не может этого сказать. Если скажем один пикет на 10 метров, так можно задать расстояние  1 метр, 2 метра
Да вот ещё для любителей кликать, на 10000 кликов. Текст, точка.

 (defun c:klk( /  namtxt txt sp_txt nampnt pnt sp_pnt
              pk_pnt  korpnt h new_pk new_ps)
(repeat 10000
(setq namtxt "")
(while (/= namtxt "TEXT")
(setq txt (car (entsel "\nPick text")))
(setq sp_txt (entget txt)) ;spisok
(setq namtxt (cdr (assoc 0 sp_txt)))
)
(setq nampnt "")
(while (/= nampnt "POINT")
(setq pnt (car (entsel "\nPick point")))
(setq sp_pnt (entget pnt)) ;spisok
(setq nampnt(cdr (assoc 0 sp_pnt)))
)
(setq pk_pnt (assoc 10 sp_pnt)) ;10,x,y,z
(setq korpnt (reverse(cdr(reverse pk_pnt)))) ;10,x,y
(setq h (atof(cdr(assoc 1 sp_txt))))
(setq new_pk (append korpnt (list h)))
(setq new_ps (subst new_pk pk_pnt sp_pnt)); zamena
(entmod new_ps)
(entupd  (cdr (assoc -1 new_ps)))
)
)

Re: Перенос из содержания текста в координату z рядом стоящей точки

> WeMaN
Программа работает. Но, странно как-то. Когда увеличиваешь очень близко текст с точкой (на экране только они), то работает.
А, если выбираешь весь чертеж, то нет.
В принципе, устраивало бы. А что если точек очень много?

Re: Перенос из содержания текста в координату z рядом стоящей точки

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

Re: Перенос из содержания текста в координату z рядом стоящей точки

о, а у меня текст с точкой, может поэтаму не работает?

Re: Перенос из содержания текста в координату z рядом стоящей точки

> WeMaN
Все работает, если выбирать по одному тексту с точкой.

Re: Перенос из содержания текста в координату z рядом стоящей точки

> WeMaN
Набери в командной строке:

(progn (princ (entget(car(entsel)))) (princ (entget(car(entsel)))))

и ткни сначала в точку, а потом в соседний текст. Результаты вставь сюда. Тогда будет ясно что там у тебя.

Re: Перенос из содержания текста в координату z рядом стоящей точки

> Игорь Богаченко

> WeMaN
Пробуйте этот вариант
Координатой Z выбранной точки считается БЛИЖАЙШИЙ текст
Команда:ZTXT

(defun C:Ztxt ( / objSet Point ptLst tmp1 tmp2 pat txtZList dst *error*)
(vl-load-com)
(defun *error*(msg)(princ msg)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))(princ))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(if (and
      (setq objSet(ssget "_:L" '((0 . "POINT"))))
      (setq Point (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
      (setq ptLst(mapcar 'cdr (mapcar '(lambda(x)(assoc 10 x))(mapcar 'entget Point))))
      (setq objSet nil objSet(ssget "_X" (list '(0 . "*TEXT")(cons 410 (getvar "CTAB")))))
      )
  (progn
    (setq tmp1 (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
    (setq tmp1 (mapcar '(lambda(x)(setq x (entget x))(list (cdr(assoc 10 x))(cdr(assoc 1 x)))) tmp1))
    (foreach pt ptlst
      (setq tmp2 (mapcar '(lambda(x)(list (distance pt (car x))(cadr x))) tmp1))
      (setq pat (car tmp2))
      (foreach dst tmp2 (if (< (car dst) (car pat))(setq pat dst)))
      (setq txtZList (cons (cadr pat) txtZList))
      )
    (setq txtZList (reverse txtZList))
    (setq txtZList (mapcar '(lambda(x)
                    (vl-string-translate "," "." (vl-string-trim  "%UuoOcC \t"   x))
                   )txtZList))
    (mapcar '(lambda(ptObj pt Z)
               (vla-put-coordinates (vlax-ename->vla-object ptObj)
                (vlax-3d-point (list (car pt)(cadr pt) Z))
               )
               )
           Point ptLst (mapcar 'atof txtZList)
            )
    )
  )
  (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )
(princ "\nType Ztxt in command line")

Re: Перенос из содержания текста в координату z рядом стоящей точки

> VVA
Спасибо, заработало, всё отлично, как раз то, что было нужно!!!
Спасибо всем тем кто помогал, за помощь!

Re: Перенос из содержания текста в координату z рядом стоящей точки

Чем лучше блоки? В атрибутах задаются текущий номер, отметка, код. По коду они соединяются и по коду же вставляются условные знаки. Половина конторской работы выполняется автоматически.

Re: Перенос из содержания текста в координату z рядом стоящей точки

> VVA
Програмка Ztxt пришлась сегодня к месту, прислали с участка точки на 0.0 и тексты с Z координатами. Геологи спросили, что делать? Пришлось показать легкое движение руки.
Но! Чуток бы ее доделать.
1. Как обычно забываем о том что WCS может быть UCS (вертикальная, например).
2. Неплохо было-бы сказать пользователю, что ему надо выбирать точки для назначения Z координаты по ближайшим текстам.
3. Как я понял выбираются все тексты в чертеже, а зачем? На мой взгляд, пусть уж пользователь сам выбирает точки и тексты. А то мало-ли.
4. И в конце можно привести еще и статистику о работе программы, сколько точек было выбрано и изменено (в идеале в скобках пределы измененных Z координат для контроля).
5. Стоит еще подумать и над тем, что и тексты перемещать на эти же высоты (уж на 0.0 их всегда легко посадить, даже без программ).

Re: Перенос из содержания текста в координату z рядом стоящей точки

> KAI
Хочу кое-что уточнить.
1. Имеется ввиду, что координата Z, написанная текстом - это координата Z точки в текущей ПСК?
2. Понятно
3. Выбираются все тексты текущего простанства. Делая так я имел ввиду следующее: допустим пользователь выбрал 5 точек и 4 текста. Их этих 4 текстов всегда найдется один самый ближайший к точке, но это будет не тот текст. Программа сама найдет ближайший текст к точке. Учитывая п.1, наверное, следует вычислять и расстояния от точки до текста в текущей ПСК.
4. Можно. Количество точек, min и max Z. В принципе можно проконтролировать, чтобы разным точкам не назначалась высота из одного текста. То есть одна точка - один текст. Если выявится, например, что 2 точкам высота Z назначена из одного текста, то точки перенесутся на эту высоту, но они и текст покрасятся в красный цвет (или пересутся на какой-либо слой)
5. Нет проблем. Будут перемещаться те тексты, которые учавствуют в назначении высоты Z точкам
6. А почему точкам? можно попросить пользователя
указать что переносить. Это может быть и блок (с атрибутом или без). А если блок с одним атрибутом, то в атрибут запишется высота Z? а если несколько, можно спросить в какой. А с помощью этого https://www.caduser.ru/forum/topic21135.html легко точки быстро поменять на блоки (или наоборот)

Re: Перенос из содержания текста в координату z рядом стоящей точки

> Victor
Ну блоками у нас условные знаки всякие, а вот отметки высот точкой и текстом...

Re: Перенос из содержания текста в координату z рядом стоящей точки

> >VVA
1. На мой взгляд это будет правильно. Что вижу, то пою. Именно в текущей ПСК. А как иначе?
3. Я имел в виду следующее: При выборе ВСЕХ текстовых объектов чертежа мы не можем гарантировать правильность выбора (который имеет в виду пользователь). Уж пусть лучше сам пользователь покажет, какие точки и тексты должны участвовать в процессе. То есть в ssget должны присутствовать POINT и *TEXT (но без _X). И в дополнение, на мой взгляд, следует искать ближайший к точке текст не в 3D, а по проекции на текущую ПСК.

4. Можно. Количество точек, min и max Z. В принципе можно проконтролировать, чтобы разным точкам не назначалась высота из одного текста. То есть одна точка — один текст. Если выявится, например, что 2 точкам высота Z назначена из одного текста, то точки перенесутся на эту высоту, но они и текст покрасятся в красный цвет (или пересутся на какой-либо слой)

Эти "навороты" я не имел в виду, просто хотел, чтобы было показано количество точек, которым назначены отметки и их пределы. Хотя….
5. Но об этом нужно как то информировать пользователя.
6. Можно (блок, окружность). Но это нужно хорошенько обдумать, и как это преподнести пользователю, я имею в виду интерфейс.

(изменено: Андрей, 7 июня 2010г. 16:25:24)

Re: Перенос из содержания текста в координату z рядом стоящей точки

VVA, Ваша программа Ztxt не срабатывает, когда текст представлен в виде текстового блока.
Поясню:
Мой файл содержит подписи высот в виде форматированных блоков, т.е. если посмотреть на блок текста в свойствах, то в поле "Содержимое" будет:
{\W1.000000;85.43}
Формат текста конечно не нужен. Достаточно просто голого текста: 85.43
Я плохо разбираюсь в Автокаде, помогите, люди добрые.