swell{d} Posted November 9, 2014 Report Share Posted November 9, 2014 Непонятно, только что означает: 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) как-то так, наверно Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted November 10, 2014 Report Share Posted November 10, 2014 Хм, тогда Вопрос: Как программно создать размерный стиль? Quote Link to comment Share on other sites More sharing options...
swell{d} Posted November 10, 2014 Report Share Posted November 10, 2014 Lion2032, ну Вы издеваетесь над нами =) даже гугол не нужен, 146% инфы на сайте _http://vbamodel.narod.ru/ _http://vbamodel.narod.ru/AutoCAD/idh_textstyles_collection.htm _http://vbamodel.narod.ru/AutoCAD/idh_dimstyles_collection.htm Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted November 10, 2014 Report Share Posted November 10, 2014 Lion2032, ну Вы издеваетесь над нами =) даже гугол не нужен, 146% инфы на сайте _http://vbamodel.narod.ru/ _http://vbamodel.narod.ru/AutoCAD/idh_textstyles_collection.htm _http://vbamodel.narod.ru/AutoCAD/idh_dimstyles_collection.htm Сорри, ступил. Обещаю исправиться. Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted November 10, 2014 Report Share Posted November 10, 2014 (edited) Вот такой код: 'Функция рисования окружности в блоке, взято отсюда: 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 November 10, 2014 by Lion2032 Quote Link to comment Share on other sites More sharing options...
swell{d} Posted November 10, 2014 Report Share Posted November 10, 2014 (edited) Фигня какая-то. 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 November 10, 2014 by swell{d} Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted November 10, 2014 Report Share Posted November 10, 2014 (edited) Фраза "Фигня какая-то" - к чему относилась: к коду, сообщению или результату программирования? 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 November 10, 2014 by Lion2032 Quote Link to comment Share on other sites More sharing options...
swell{d} Posted November 11, 2014 Report Share Posted November 11, 2014 IAcadBlock чем отличается от AcadBlock? Я не знаю. Если один вариант не работает, пробую второй вариант. Но везде должно быть одинаково. Регенерация, так кодиться: ThisDrawing.Regen True ? у меня сделано так: ThisDrawing.SendCommand "Regen " Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted November 23, 2014 Report Share Posted November 23, 2014 Как программно задать междустрочный интервал в Нанокаде? (LineSpacingDistance - не работает ) _http://vbamodel.narod.ru/AutoCAD/idh_LineSpacingDistance.htm Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 14, 2015 Report Share Posted January 14, 2015 (edited) Есть такой код: 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 January 14, 2015 by Lion2032 Quote Link to comment Share on other sites More sharing options...
Kreator Posted January 15, 2015 Report Share Posted January 15, 2015 (edited) Distance As Double ' Текстбокс 3' FormData.Distance = UserForm1.TextBox3.Text 100 лет на VBA не писал, но что бросилось в глаза - тип данных справа не соответствует типу данных слева - Вы пытаетесь текст передать переменной десятичного типа. Попробуйте сконвертировать (функцию не помню, в справке смотрите). Вряд ли явное приведение типов сработает, но тоже попробуйте. FormData.Distance = UserForm1.TextBox3.Text as Double Edited January 15, 2015 by Kreator Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 15, 2015 Report Share Posted January 15, 2015 Distance As Double ' Текстбокс 3' FormData.Distance = UserForm1.TextBox3.Text 100 лет на VBA не писал, но что бросилось в глаза - тип данных справа не соответствует типу данных слева - Вы пытаетесь текст передать переменной десятичного типа. Попробуйте сконвертировать (функцию не помню, в справке смотрите). Вряд ли явное приведение типов сработает, но тоже попробуйте. FormData.Distance = UserForm1.TextBox3.Text as Double Спасибо. Я уже разобрался. Заменил тип данных с Double на Text Теперь не введенные данные воспринимает как пустую строку. Distance As Text Quote Link to comment Share on other sites More sharing options...
Lion007 Posted January 16, 2015 Report Share Posted January 16, 2015 ну какой, к едрене фене text! это же *Distance*! всего и делов-то Distance as Double ... FormData.Distance = CDbl(UserForm1.TextBox3.Text) 1 Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 16, 2015 Report Share Posted January 16, 2015 ну какой, к едрене фене text! это же *Distance*! всего и делов-то Distance as Double ... FormData.Distance = CDbl(UserForm1.TextBox3.Text) В том-то и дело, что если строка не задана даже данный код выдает ошибку. Quote Link to comment Share on other sites More sharing options...
Lion007 Posted January 16, 2015 Report Share Posted January 16, 2015 значит проверить надо - задано или нет. детский сад, штаны на лямках! 1 Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 16, 2015 Report Share Posted January 16, 2015 Разные варианты расчетов, в одном случае нужно задавать параметр, в другом не нужно. Вот когда его задавать не нужно, тогда и выдает ошибку.... Quote Link to comment Share on other sites More sharing options...
Lion007 Posted January 16, 2015 Report Share Posted January 16, 2015 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) 2 Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 16, 2015 Report Share Posted January 16, 2015 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) Шикарно! ЗачОт! :) Quote Link to comment Share on other sites More sharing options...
Lion007 Posted January 16, 2015 Report Share Posted January 16, 2015 это еще надо проверить, как CDbl отреагирует на текст типа "екалэмэнэ" 1 Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 16, 2015 Report Share Posted January 16, 2015 это еще надо проверить, как CDbl отреагирует на текст типа "екалэмэнэ" А там я буду создавать спец. функцию правильности проверки введенных данных. Вот только допишу основные модули. Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 17, 2015 Report Share Posted January 17, 2015 Выдает ошибку 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 Quote Link to comment Share on other sites More sharing options...
Robink Posted January 17, 2015 Report Share Posted January 17, 2015 Выдает ошибку 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 Предпоследняя строчка перед енд фуншен. Quote Link to comment Share on other sites More sharing options...
Kreator Posted January 17, 2015 Report Share Posted January 17, 2015 (edited) Выдает ошибку 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 January 17, 2015 by Kreator Quote Link to comment Share on other sites More sharing options...
Lion2032 Posted January 17, 2015 Report Share Posted January 17, 2015 Хорошо, а как правильно задать массив? Что бы возвратить тоже массив Потому что такая конструкция выдает ошибку: "Expected )" Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double Quote Link to comment Share on other sites More sharing options...
Robink Posted January 17, 2015 Report Share Posted January 17, 2015 Хорошо, а как правильно задать массив? Что бы возвратить тоже массив Потому что такая конструкция выдает ошибку: "Expected )" Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double Уберите двойки Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.