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

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

Округление текста

Ответ
Поиск в этой теме
Непрочитано 29.04.2005, 06:50 #1
Округление текста
Димас
 
джедай
 
Магадан
Регистрация: 31.01.2005
Сообщений: 460

Доброго времени суток
Не подскажете возможно ли автоматически округлять mtext и text?
Т.е. допустим у меня введены числа 6,457 и 8,65
Нужно все округлить вот так -> 6,5 и 8,7

Возможно ли такое стандартыми средтвами автокада или нужно что-то писать?
Просмотров: 21097
 
Непрочитано 29.04.2005, 08:19
#2
Огурец

Profan
 
Регистрация: 27.04.2005
Москва
Сообщений: 6,753
Отправить сообщение для Огурец с помощью Skype™


Уважаемый Димас!
Если речь идёт о размерных числах, то это в Format=>Dimension style=>modify=>Primary units=>Precision и в выпадающем списке выбираете столько нулей после запятой, сколько Вам необходимо.
Огурец вне форума  
 
Автор темы   Непрочитано 29.04.2005, 08:43
#3
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


К сожалению не о размерных :(( Команда Units тоже не помогает.

Есть просто текст, вбит в файл как просто текст. Текста много.
Был бы один файл можно было бы извратиться через Find&Replace
А так - файлов много, еще дольше получается :((

Может у кого есть уже лисп написанный?

Или подскажете как можно по другому сделать?
Димас вне форума  
 
Непрочитано 29.04.2005, 10:47
#4
Ev

Проектирование
 
Регистрация: 29.04.2005
Сообщений: 1


если быстро то вот.
проверял только на Text. Работает если число написано отдельной строкой.

Код:
[Выделить все]
(defun c:111()
 (setq name (car (entsel))
       ed (entget name)
       ed (subst (cons 1 (rtos (atof (cdr (assoc 1 (entget name)))) 2 1)) (assoc 1 ed) ed)
 )
 (entmod ed)
 (prin1)
)
Ev вне форума  
 
Непрочитано 29.04.2005, 11:09
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<phrase 1=


Используя отсюда http://dwg.ru/forum/viewtopic.php?p=...ghlight=#28543 код Alaspher'а:
Код:
[Выделить все]
(defun pl:round (num digit / fact) 
  (setq fact 1.0) 
  (repeat (abs digit) (setq fact (* 10 fact))) 
  (if (minusp digit) 
    (setq fact (/ 1.0 fact)) 
  ) 
  (setq num (/ (fix (+ (* num fact) 0.5)) fact)) 
  (if (> 1 digit) 
    (fix num) 
    num 
  ) 
)
можно написать функцию для текстов (dtext и mtext ), например так:
!!!- это без проверки на наличие числа в строке текста !!!
Код:
[Выделить все]
(defun c:ap_text (/ text_obj Obj)
  (VL-LOAD-COM)
  (prompt "\nSelect Text objects:")
  (if (ssget (list (cons 0 "*TEXT")))
    (progn
      (setq Objs (vla-get-ActiveSelectionSet
		   (vla-get-ActiveDocument (vlax-get-acad-object))
		 )
      )
      (vlax-for	text_obj Objs
	(if (vlax-property-available-p text_obj "TextString" T)
	  (vla-put-TextString
	    text_obj
	    (pl:round (atof (vla-get-TextString text_obj)) 1)
					; 1-кол-во знаков после запятой
	  )
	)
      )
    )
  )
(princ)
)
Apelsinov вне форума  
 
Непрочитано 29.04.2005, 13:33
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Apelsinov
!!!- это без проверки на наличие числа в строке текста !!!
Для проверки на "численность" текста, можно использовать функцию:
Код:
[Выделить все]
(defun pl:is-real-form (val / tmp)
  (setq tmp (substr val 1 1))
  (if (or (= tmp "-") (= tmp "+"))
    (setq val (substr val 2))
  )
  (cond
    ((not (= (vl-string-trim "0123456789.," val) "")) nil)
    ((= (vl-string-trim "0123456789" val) "") "")
    ((< 1
        (length
          (vl-remove-if-not (function (lambda (a) (or (= a 44) (= a 46)))) (vl-string->list val))
        )
     )
     nil
    )
    (t
     (vl-list->string
       (mapcar (function (lambda (b)
                           (if (or (= b 44) (= b 46))
                             46
                             48
                           )
                         )
               )
               (vl-string->list (vl-string-left-trim "0123456789" val))
       )
     )
    )
  )
)
Предназначена она для другого (поиск знаков после десятичной точки в строке), так что возврат не T|nil, а либо строка вида ".00", либо nil, если в строке не число.
Хотя, можно и упростить проверку.
Alaspher вне форума  
 
Автор темы   Непрочитано 30.04.2005, 02:47
#7
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Спасибо всем за ответы.

Были проблемы с интернетом - пришлось самому думать :((
Лисп я не знаю - пришлось на VBA - в нем проще показалось разбираться
Вот что получилось

Код:
[Выделить все]
Sub test()
   Dim textObj As AcadText
   Dim sstext As AcadSelectionSet
   Dim FilterType(0) As Integer
   Dim FilterData(0) As Variant
   
    Dim valueAsStr As String
    Dim precision As Integer
    Dim valueAsReal As Double
    precision = 1
' âûáèðàåì òåêñò â ðèñóíêå
   Set sstext = ThisDrawing.SelectionSets.Add("SS3")
   FilterType(0) = 0
   FilterData(0) = "Text"
   sstext.SelectOnScreen FilterType, FilterData

 Set selset = ThisDrawing.SelectionSets("SS3")

  Dim ent As Object
  Dim j As Integer
  Dim textString As String
    
    'find each object in the selection set
    j = 0
    For Each ent In selset
           'îêðóãëÿåì
           'Convert a real value 17.5 using Decimal mode to a String
    distAsString = ent.textString
    distAsReal = ThisDrawing.Utility.DistanceToReal(distAsString, acDecimal)
    'MsgBox distAsString & "  " & distAsReal
    
    If Not ent.Layer = "U" Or ent.Layer = "G" Then
    'îêðóãëÿåì
    distAsReal = Round(distAsReal, 2)
    Else
    distAsReal = Round(distAsReal, 1)
    End If
    ent.textString = distAsReal
                 'âûáîð ñëîÿ è çàìåíà åñëè ìåíüøå
                If ent.Layer = "U" Then
                        'ìåíÿåì åñëè ìåíüøå 0,2
                        If distAsReal - 0.2 < 0 Then ent.textString = "<0.2"
                ElseIf ent.Layer = "G" Then
                        'ìåíÿåì åñëè ìåíüøå 5,0
                            If distAsReal - 5# < 0 Then ent.textString = "<5.0"
                Else

                End If
    
    ent.Update
    j = j + 1
    Next
'Óäàëÿþ ñóùåñòâóþùèé íàáîð
   ThisDrawing.SelectionSets.Item("SS3").Delete
End Sub
Сильно не пинайте :)
Димас вне форума  
 
Непрочитано 30.04.2005, 09:00
#8
{Smirnoff}

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


Обясните мне дураку, после такого количества кода. Почему бы не выбрать текст с нужными высотами через QSelect, (ssx) или Filter и не поменять в окне Properties высоту для всего выбранного набора?
{Smirnoff} вне форума  
 
Непрочитано 30.04.2005, 09:58
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Fantomas
Обясните мне дураку, после такого количества кода. Почему бы не выбрать текст с нужными высотами через QSelect, (ssx) или Filter и не поменять в окне Properties высоту для всего выбранного набора?
А при чём здесь высота текста, когда речь идёт об изменении значения текстовой строки? Или я ничего не понял... [sm2102]
По поводу VBA'шного кода - ничего не скажу - не мастер в нём.
Alaspher вне форума  
 
Непрочитано 30.04.2005, 11:12
#10
{Smirnoff}

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


Точно! Кретин я :? Когда писал постинг ещё не проснулся толком...
{Smirnoff} вне форума  
 
Непрочитано 06.05.2005, 12:08
#11
Serg Ivanov

Инженер ВК
 
Регистрация: 19.11.2004
Кишинёв
Сообщений: 196


Цитата:
Сообщение от Огурец
Уважаемый Димас!
Если речь идёт о размерных числах, то это в Format=>Dimension style=>modify=>Primary units=>Precision и в выпадающем списке выбираете столько нулей после запятой, сколько Вам необходимо.
А можно ли огруглять размеры ДО запятой? В строительстве размеры в миллиметрах, а точность +/- 10см.
__________________
С уважением, Serg Ivanov.
Serg Ivanov вне форума  
 
Непрочитано 06.05.2005, 14:27
#12
master_vlad


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


Цитата:
Сообщение от Serg Ivanov
А можно ли огруглять размеры ДО запятой? В строительстве размеры в миллиметрах, а точность +/- 10см.
dim roundoff = 10 округляет до 10; =100 до 100 ит.д.
master_vlad вне форума  
 
Автор темы   Непрочитано 07.05.2005, 03:26
#13
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Наверное я немного не правильно сформулировал вопрос. :))

Попробую еще раз.
В чертеже есть текст - содержания золота/серебра
Было принято решение округлить текст до десятых.
Округлять в ручную - долго + возможны ошибки человека, округляющего.

Как я понял в Автокаде нет возможности округлять просто текст (как допустим значение поля, или как в екселе).

Поэтому пришлось написать програмку на VBA (округляет текст в заданных слоях)

Может кто знает как это сделать без lisp и VBA? только средствами автокада или так чтобы была возможность сделать откат на неокругленные значения?
Димас вне форума  
 
Непрочитано 07.05.2005, 12:44
#14
Perezz!!
Moderator

архитектор
 
Регистрация: 21.08.2003
Москва
Сообщений: 3,587


Ну, а если в чертеже есть картинка, полагаете, в Автокаде должны быть инструменты, фильтры и плагины для её обработки? Но ведь как раз этим занимаются в Фотошопе! Тексты хорошо обрабатываются на текстовых процессорах, типа Ворда, массивы данных - в базах данных (Аксесс), числовые массивы - в электронных таблицах (Ексель). В Автокаде же хорошо, просто изумительно, чертить и моделировать. Вам что нужно?
Perezz!! вне форума  
 
Непрочитано 07.05.2005, 14:48
#15
Serg Ivanov

Инженер ВК
 
Регистрация: 19.11.2004
Кишинёв
Сообщений: 196


Цитата:
Сообщение от master_vlad
Цитата:
Сообщение от Serg Ivanov
А можно ли огруглять размеры ДО запятой? В строительстве размеры в миллиметрах, а точность +/- 10см.
dim roundoff = 10 округляет до 10; =100 до 100 ит.д.
Пишет "Unknown command" - не понял
__________________
С уважением, Serg Ivanov.
Serg Ivanov вне форума  
 
Непрочитано 07.05.2005, 17:30
#16
master_vlad


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


Format->Dimension style->Primary units-> Round off

Для отдельных размеров удобнее править в PROPERTIES
master_vlad вне форума  
 
Автор темы   Непрочитано 08.05.2005, 02:20
#17
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от Perezz!!
Ну, а если в чертеже есть картинка, полагаете, в Автокаде должны быть инструменты, фильтры и плагины для её обработки? Но ведь как раз этим занимаются в Фотошопе! Тексты хорошо обрабатываются на текстовых процессорах, типа Ворда, массивы данных - в базах данных (Аксесс), числовые массивы - в электронных таблицах (Ексель). В Автокаде же хорошо, просто изумительно, чертить и моделировать. Вам что нужно?
Честно говоря хотелось бы все в одном :))

Или хотябы чтоб была полная совместимость - типа щелкнул по картинке - вышел в фотошоп, по тексту - в ворд :)))

Да и работа с базой данных как-т окриво реализована (или это я криво настроил) :)))

Начал новую тему http://dwg.ru/forum/viewtopic.php?t=3653
про базы данных и округление
Димас вне форума  
 
Непрочитано 10.05.2005, 12:54
#18
Perezz!!
Moderator

архитектор
 
Регистрация: 21.08.2003
Москва
Сообщений: 3,587


А чем эта перестала устраивать?
Perezz!! вне форума  
 
Непрочитано 12.05.2005, 11:24
#19
Serg Ivanov

Инженер ВК
 
Регистрация: 19.11.2004
Кишинёв
Сообщений: 196


Цитата:
Сообщение от master_vlad
Format->Dimension style->Primary units-> Round off

Для отдельных размеров удобнее править в PROPERTIES
Спасибо!
__________________
С уважением, Serg Ivanov.
Serg Ivanov вне форума  
 
Непрочитано 28.01.2011, 16:20 не могу округлить числа
#20
BadB_85


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


добрый день!не подскажите как в автокаде 2007 округлить числа.есть высота точек!она в тысячных,а мне бы округлить до сотых!как быть??
Вложения
Тип файла: dwg
DWG 2007
1111.dwg (57.3 Кб, 4187 просмотров)
BadB_85 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Округление текста

Размещение рекламы