|
Формирование SVG файла через фабрику XDTO | ☑ | ||
---|---|---|---|---|
0
tan76
19.09.24
✎
20:25
|
Надумал я генерить svg из под 1С. Загрузил в конфу XSD схемы и через фабрику формирую элементы картинки.
ГлавныйКонтейнер = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg ,"svgType"); ГлавныйКонтейнер.id = Строка(Новый УникальныйИдентификатор); ГлавныйКонтейнер.width=720; ГлавныйКонтейнер.height=576; Прямоугольник = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg ,"rectType"); Прямоугольник.x="0"; Прямоугольник.y="0"; Прямоугольник.width="400"; Прямоугольник.height="400"; Прямоугольник.fill="#dfdc49"; Прямоугольник.stroke="black"; Прямоугольник.stroke_width="5px"; Прямоугольник.stroke_opacity="0.5"; ГлавныйКонтейнер.rect.Добавить(Прямоугольник); Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg ,"textType"); Текст.x="20"; Текст.y="35"; ГлавныйКонтейнер.text.Добавить(Текст); ЗаписьXML = Новый ЗаписьXML; //ЗаписьXML.ОткрытьФайл("r:\test.svg"); ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьОбъявлениеXML(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ГлавныйКонтейнер,"svg","http://www.w3.org/2000/svg Сообщить(ЗаписьXML.Закрыть()); Результат получается такой: <?xml version="1.0"?> <svg xmlns="http://www.w3.org/2000/svg xmlns:xs="http://www.w3.org/2001/XMLSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance id="8039b82d-e9e4-4c3e-bb99-364eb187b1fe" width="720" height="576"> <rect fill="#dfdc49" stroke="black" stroke-opacity="0.5" stroke-width="5px" x="0" y="0" width="400" height="400"/> <text x="20" y="35"/> </svg> проблема в том что строка <text x="20" y="35"/> не имеет собственно значения и я не знаю способа его установить. результат должен быть <text x="20" y="35">Мой текст</text>, подскажите, как его достичь, как объекту Текст присвоить содержимое. демка здесь https://disk.yandex.ru/d/WHbtft91PEapzA на 8.3.17.1851 работает точно, остальные релизы как повезет. |
|||
1
RomanYS
19.09.24
✎
19:15
|
на 25й платформе демка не работает
|
|||
2
tan76
19.09.24
✎
19:19
|
на 25й не пробовал, работаю на 8.3.17.1851
|
|||
3
Garykom
19.09.24
✎
20:30
|
||||
4
tan76
19.09.24
✎
21:10
|
(3) что то я не разобрался как у них там все заработало
берем пример: об = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema" , "anyType")); ЗначениеАтрибута=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema" , "string"), "840"); об.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema" , "id",ЗначениеАтрибута); ГлавныйКонтейнер.text.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema" , "currency",об); |
|||
5
tan76
19.09.24
✎
21:14
|
получаем ошибку:
{ОбщаяКоманда.П33Т1.МодульКоманды(62)}: Слишком много фактических параметров ГлавныйКонтейнер.text.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema , "currency",об); метод "Добавить" с тремя параметрам видимо применим к объектуxdto у меня же ГлавныйКонтейнер.text это списокxdto, я туда готовый объект со значением добавить должен но у ФабрикаXDTO.Создать тоже только два параметра, куда подсунуть нужный текст? |
|||
6
tan76
19.09.24
✎
21:21
|
попробовал добавить значениеXDTO
НужныйМнеТекст=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2000/svg" , "textType"), "Проверочка"); ГлавныйКонтейнер.text.Добавить(НужныйМнеТекст); падает с ошибкой: {ОбщаяКоманда.П33Т1.МодульКоманды(55)}: Ошибка при вызове метода контекста (Создать) НужныйМнеТекст=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2000/svg" , "textType"), "Проверочка"); по причине: Несоответствие типов (параметр номер '2') |
|||
7
tan76
20.09.24
✎
09:10
|
Помощь все ещё нужна, я в тупике.
переформулирую проблему, код Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg" ,"textType"); создает объектXDTO со всеми нужными атрибутами, осталось только при создании или после установить само текстовое значение объекта. Как это сделать? |
|||
8
Asmody
20.09.24
✎
09:34
|
(7) У свойства типа объекта есть свойство Форма.
![]() Тебе нужно то, у которого Форма = Текст |
|||
9
Dzenn
20.09.24
✎
09:41
|
(0) в (8) нужный ответ. Просто объяви ещё одно свойство типа текст. Хотя не очень понимаю твою необходимость генерить свг через иксдто )
|
|||
10
tan76
20.09.24
✎
10:13
|
(8) у "textType" свойства с такой формой нет. Добавить не удалось так как схема перестает быть валидной.
Ошибка проверки модели XDTO: xdto-objectType-3.5.5 тип: textType пакет: http://www.w3.org/2000/svg Недопустимая форма XML представления 'Text' свойства 'Свойство1' |
|||
11
tan76
20.09.24
✎
10:05
|
(9) первоначально казалось что это удобней чем поэлементная запись xml. + я не силен в svg а схема дает шаблон в котором есть все нужное для дальнейшей работы.
|
|||
12
Dzenn
20.09.24
✎
10:36
|
(11) можешь ссылку на первоисточник xsd скниуть? посмотрю тоже, интересная затея
|
|||
13
tan76
20.09.24
✎
11:02
|
(12) поищу, я их несколько пробовал и не вчера, давно это было. В 1С загрузилась лишь одна, та что в демке
|
|||
14
tan76
20.09.24
✎
11:37
|
(12) скорей всего использованы эти схемы
http://www.w3.org/TR/2002/WD-SVG11-20020108/xml.xsd http://www.w3.org/TR/2002/WD-SVG11-20020108/xlink.xsd http://www.w3.org/TR/2002/WD-SVG11-20020108/SVG.xsd |
|||
15
Asmody
20.09.24
✎
14:03
|
Вообще-то, никто не обещал, что Пакет XDTO будет совместим с любым XSD.
|
|||
16
tan76
20.09.24
✎
16:53
|
не решаемая задача?
|
|||
17
big
20.09.24
✎
19:16
|
XML-файл можно формировать разными способами. Зачем зацикливаться на средствах 1С:8.хх ?
з.ы. вообще то xml - это просто текстовый файл. Можно крутить как хочешь ;) |
|||
18
Garykom
20.09.24
✎
20:58
|
(16) Не тупи
Текст.Добавить("тут string") |
|||
19
tan76
20.09.24
✎
23:45
|
(18) к сожалению так просто не работает
|
|||
20
tan76
20.09.24
✎
23:58
|
(18) если добавлять по СП
Текст.Добавить(<Форма>, <URIПространстваИмен>, <ЛокальноеИмя>, <ЭлементДанных>) то проблема уже в первом параметре так как СП прямо говорит что <Форма> (обязательный) Тип: ФормаXML. Форма XML представления произвольного свойства. Может принимать значения Элемент или Атрибут. а мне насколько я понимаю нужно ФормаXML.Текст ежели добавлять как ФормаXML.Элемент то результат шляпа <text x="20" y="35"> <text xmlns="">Проверочка</text> </text> |
|||
21
DiMel_77
21.09.24
✎
10:17
|
Круто завернули (через XDTO формировать пакеты). Отпишитесь если выйдет. У меня в свое время получилось только через ДокументDOM сделать.
Как то так было сделано: ТекстФигуры = ДокументDOM.СоздатьЭлемент("text"); ТекстФигуры.УстановитьАтрибут("x", КоординатаX); ТекстФигуры.УстановитьАтрибут("y", КоординатаY); ТекстФигуры.УстановитьАтрибут("text-anchor", "middle"); ТекстовыйУзел = ДокументDOM.СоздатьТекстовыйУзел(Текст); ТекстФигуры.ДобавитьДочерний(ТекстовыйУзел); Я бы не связывался с XDTO в данном вопросе... |
|||
22
tan76
21.09.24
✎
10:40
|
(17)(21) Тут вся выгода в именно в схеме, так сказать инструмент и инструкция в одном флаконе. Для прямоугольника и круга можно и в блокнотике набросать в ручную. Но есть необходимость создавать сложные рисунки, и всё работает шикарно, кроме текста. Не хочу эту идею забрасывать, надеюсь довести до результата.
|
|||
23
DiMel_77
22.09.24
✎
10:09
|
(22) Посмотрел я схему, там прикол в том. что в свойствах типа объекта "textType" установлен смешанный тип. Это означает, что текстовое содержимое блока может содержать вложенные теги. Например так:
<text x="10" y="30"> You are <tspan>not</tspan> a banana! </text> А это означает, что необходимо использовать ПоследовательностьXDTO. В результате добавление текстового элемента осуществляется так: Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg" ,"textType"); Текст.x="20"; Текст.y="35"; ПоследовательностьXDTO = Текст.Последовательность(); ПоследовательностьXDTO.Добавить("Текст для проверки"); ГлавныйКонтейнер.text.Добавить(Текст); Не за что :) |
|||
24
tan76
22.09.24
✎
20:11
|
(23) Да как же не за что, очень даже есть за что!!! Спасибо! сам я бы до такого не додумался.
|
|||
25
oleg_km
23.09.24
✎
00:03
|
(23) А я-то думал, почему текст приходится читать через ПоследовательностьXDTO. А оказывается возможны еще вложенные теги
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |