Jump to content

Первые шаги в мир программирования под nanoCAD


Recommended Posts

Непонятно, только что означает: On Error Resume Next

погуглите. msdn в помощь. вообще лучше этой штукой не пользоваться, не знаю, почему она тут проскочила =)

нужно задать стиль текста в данной подпрограмме

Если стиль есть в документе, то всё просто:


   Dim obj As AcadDimRotated
   Set obj = ms.AddDimRotated(pt1, pt2, pt3, rotation / 57.2957795130823)
   obj.StyleName = "имя размерного стиля"

Если надо создать новый, то тут я ничем не помогу

 

Моя концепция правильная, в данном случае?:

Если делать просто, то я бы генерировал имя блока так: префикс + случайное число (генератором).

Если нужна именно последовательность, то да, в цикле проверяем имена блоков, как только номер не найден - берём его.

For i = 1 To 999

If Not (проверка существования блока с номером i) Then

Exit For

End If

Next

(здесь создаём блок с номером i)

 

как-то так, наверно

Link to comment
Share on other sites

Lion2032, ну Вы издеваетесь над нами =) даже гугол не нужен, 146% инфы на сайте _http://vbamodel.narod.ru/

_http://vbamodel.narod.ru/AutoCAD/idh_textstyles_collection.htm

_http://vbamodel.narod.ru/AutoCAD/idh_dimstyles_collection.htm

Link to comment
Share on other sites

Lion2032, ну Вы издеваетесь над нами =) даже гугол не нужен, 146% инфы на сайте _http://vbamodel.narod.ru/

_http://vbamodel.narod.ru/AutoCAD/idh_textstyles_collection.htm

_http://vbamodel.narod.ru/AutoCAD/idh_dimstyles_collection.htm

 

Сорри, ступил. Обещаю исправиться. :rolleyes:

Link to comment
Share on other sites

Вот такой код:

 

'Функция рисования окружности в блоке, взято отсюда: http://forum.nanocad.ru/index.php?showtopic=3182&view=findpost&p=28527
Sub b_Circle(block As IAcadBlock, x1 As Double, y1 As Double, radius As Double, Optional Circle_weight As Double = -2, Optional Circle_type As String = "ByLayer")
	On Error Resume Next
	Dim pt1(2) As Double
	pt1(0) = x1
	pt1(1) = y1
	Dim circleObj As AcadCircle
	Set circleObj = block.AcadCircle(pt1, radius)

	If Circle_weight <> -2 Then					'Если по каким-либо причинам толщина линии не равна -2,
			circleObj.LineWeight = Circle_weight   ' то толщине присваивается значение указанной в опциональном параметре Circle_weight, т.е. -2
	End If
	If Circle_type <> "ByLayer" Then			   'Аналогично толщине, только для типа линии
			circleObj.LineType = Circle_type
	End If
End Sub


' Определим блок, который будет рисовать зоны защиты
Dim blockObj As AcadBlock
Set blockObj = ThisDrawing.Blocks.Add(insert_point, "Зона защиты в плане")

'Добавим в блок 2 окружности: защита МЗС r0 и rx
Dim CircleObj1 As AcadCircle, CircleObj2 As AcadCircle

MY_LAYER "_ЕОМ_SILA_SHINA", 246  'Задаем слой
b_Circle CircleObj1, insert_point(0), insert_point(1), r0 'Зона защиты r0
b_Circle CircleObj2, insert_point(0), insert_point(1), rx 'Зона защиты rx

' Вставим блок
Dim blockRefObj As AcadBlockReference
Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insert_point, "Зона защиты в плане", 1#, 1#, 1#, 0)

 

Все работает, только не чертит. Хотя в модели данный блок присутствует, но в нем почему-то нет элементов.

Не могу понять, почему? Ошибок тоже не выдает.

Edited by Lion2032
Link to comment
Share on other sites

Фигня какая-то.

On Error Resume Next удалите - будут ошибки, т.к. вы в объект типа IAcadBlock пытаетесь впихнуть AcadCircle.

 

Поменяйте строки на

b_Circle blockObj, insert_point(0), insert_point(1), r0 
b_Circle blockObj, insert_point(0), insert_point(1), rx

можт и заработает.

хотя я бы ещё регенерацию в конце добавил

Edited by swell{d}
Link to comment
Share on other sites

Фраза "Фигня какая-то" - к чему относилась: к коду, сообщению или результату программирования?

 

IAcadBlock чем отличается от AcadBlock?

Здесь искал, не нашел: http://forum.nanocad.ru/index.php?showtopic=5779

 

Регенерация, так кодиться: ThisDrawing.Regen True ?

 

Так тоже не работает

b_Circle blockObj, insert_point(0), insert_point(1), r0
b_Circle blockObj, insert_point(0), insert_point(1), rx

 

On Error Resume Next убрал, стал выдавать ошибку 91, в этой строке:

Set CircleObj = block.AcadCircle(pt1, radius)

 

Заменил на

Dim CircleObj As AcadCircle
Set CircleObj = block.AddCircle(pt1, radius)

 

Все равно не работает?

Edited by Lion2032
Link to comment
Share on other sites

IAcadBlock чем отличается от AcadBlock?

Я не знаю. Если один вариант не работает, пробую второй вариант. Но везде должно быть одинаково.

Регенерация, так кодиться: ThisDrawing.Regen True ?

у меня сделано так:

ThisDrawing.SendCommand "Regen "

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

Есть такой код:


Public Type FormData1

CalculationMethod As String	 ' Комбобокс 1'
Reliability As String	       ' Комбобокс 2'
ProtectionType As String	  ' Комбобокс 3'
TypeVariation As String		 ' Комбобокс 4'
Height As Double		  ' Текстбокс 1'
ProtectionZone As Double	  ' Текстбокс 2'
Distance As Double		   ' Текстбокс 3'

End Type

'Процедура установки соответствия (загрузки)'
'данных структуры данным из комбобоксов (текстбоксов)'
Sub LoadFormData1(FormData As FormData1)

FormData.CalculationMethod = UserForm1.ComboBox1.Value
FormData.Reliability = UserForm1.ComboBox2.Value
FormData.ProtectionType = UserForm1.ComboBox3.Value
FormData.TypeVariation = UserForm1.ComboBox4.Value
FormData.Height = UserForm1.TextBox1.Text
FormData.ProtectionZone = UserForm1.TextBox2.Text
FormData.Distance = UserForm1.TextBox3.Text

End Sub

 

Если FormData.Distance = UserForm1.TextBox3.Text = 0, то выдает ошибку.

Что делать?

 

Задать начальное значение не предлагать, т.к. перебивает значение в UserForm1.TextBox3.Text

Edited by Lion2032
Link to comment
Share on other sites

Distance As Double ' Текстбокс 3'

FormData.Distance = UserForm1.TextBox3.Text

100 лет на VBA не писал, но что бросилось в глаза - тип данных справа не соответствует типу данных слева - Вы пытаетесь текст передать переменной десятичного типа. Попробуйте сконвертировать (функцию не помню, в справке смотрите). Вряд ли явное приведение типов сработает, но тоже попробуйте.

FormData.Distance = UserForm1.TextBox3.Text as Double

Edited by Kreator
Link to comment
Share on other sites

Distance As Double ' Текстбокс 3'

FormData.Distance = UserForm1.TextBox3.Text

100 лет на VBA не писал, но что бросилось в глаза - тип данных справа не соответствует типу данных слева - Вы пытаетесь текст передать переменной десятичного типа. Попробуйте сконвертировать (функцию не помню, в справке смотрите). Вряд ли явное приведение типов сработает, но тоже попробуйте.

FormData.Distance = UserForm1.TextBox3.Text as Double

 

Спасибо. Я уже разобрался.

Заменил тип данных с Double на Text

Теперь не введенные данные воспринимает как пустую строку.

Distance As Text

Link to comment
Share on other sites

ну какой, к едрене фене text! это же *Distance*!

всего и делов-то

Distance as Double
...
FormData.Distance = CDbl(UserForm1.TextBox3.Text)

 

В том-то и дело, что если строка не задана даже данный код выдает ошибку.

Link to comment
Share on other sites

if (UserForm1.TextBox3.Text <> "") then
 FormData.Distance = CDbl(UserForm1.TextBox3.Text)
else
 FormData.Distance = 0
endif

или даже так :

public function textToDouble(s as string, optional defVal as double = 0#) as double
 textToDouble = defVal
 if (s <> "") then
   textToDouble = CDbl(s)
 endif
end function
...
FormData.Distance = textToDouble(UserForm1.TextBox3.Text)

  • Like 2
Link to comment
Share on other sites

if (UserForm1.TextBox3.Text <> "") then
 FormData.Distance = CDbl(UserForm1.TextBox3.Text)
else
 FormData.Distance = 0
endif

или даже так :

public function textToDouble(s as string, optional defVal as double = 0#) as double
 textToDouble = defVal
 if (s <> "") then
textToDouble = CDbl(s)
 endif
end function
...
FormData.Distance = textToDouble(UserForm1.TextBox3.Text)

 

Шикарно! ЗачОт!

:) :) :)

Link to comment
Share on other sites

это еще надо проверить, как CDbl отреагирует на текст типа "екалэмэнэ" :)

 

А там я буду создавать спец. функцию правильности проверки введенных данных.

Вот только допишу основные модули.

Link to comment
Share on other sites

Выдает ошибку Expected array.

Что я сделал не так?

 

 

Public Function CenterArc3point(pt1 As Double, pt2 As Double, pt3 As Double) As Double

   Dim ma As Double	 
   Dim mb As Double	
   Dim ptArc(2) As Double

   ma = (pt2(1) - pt1(1)) / (pt2(0) - pt1(0))
   mb = (pt3(1) - pt1(1)) / (pt3(0) - pt1(0))

   ptArc(0) = pt2(0)
   ptArc(1) = (-1 / ma) * (ptArc(0) - ((pt1(0) + pt2(0)) / 2) + (pt1(1) + pt2(1)) / 2)
   ptArc(2) = 0
   CenterArc3point = ptArc
End Function

Link to comment
Share on other sites

Выдает ошибку Expected array.

Что я сделал не так?

 

 

Public Function CenterArc3point(pt1 As Double, pt2 As Double, pt3 As Double) As Double

Dim ma As Double	
Dim mb As Double	
Dim ptArc(2) As Double

ma = (pt2(1) - pt1(1)) / (pt2(0) - pt1(0))
mb = (pt3(1) - pt1(1)) / (pt3(0) - pt1(0))

ptArc(0) = pt2(0)
ptArc(1) = (-1 / ma) * (ptArc(0) - ((pt1(0) + pt2(0)) / 2) + (pt1(1) + pt2(1)) / 2)
ptArc(2) = 0
CenterArc3point = ptArc
End Function

Предпоследняя строчка перед енд фуншен.

Link to comment
Share on other sites

Выдает ошибку Expected array.

Что я сделал не так?

 

 

Public Function CenterArc3point(pt1 As Double, pt2 As Double, pt3 As Double) As Double

ma = (pt2(1) - pt1(1)) / (pt2(0) - pt1(0))

Вы передаёте в качестве параметров обычные десятичные значения, а потом от них хотите получить элементы массива. pt1 - это не массив, а pt1(1) - работа с массивом. Отсюда и ошибка - предполагается массив, а его нет.

И вообще, с типами данных разберитесь. Здесь и функция возвращает не массив, хотя присвоение идёт массива.

Edited by Kreator
Link to comment
Share on other sites

Хорошо, а как правильно задать массив?

Что бы возвратить тоже массив

 

Потому что такая конструкция выдает ошибку: "Expected )"

Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double

Link to comment
Share on other sites

Хорошо, а как правильно задать массив?

Что бы возвратить тоже массив

 

Потому что такая конструкция выдает ошибку: "Expected )"

Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double

Уберите двойки

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...