VSTO не может захватывать вложенные группы в слайдах PowerPoint.
Например, р а с с м о т р и м с л е д у ю щ у ю с т р у к т у р у : < / p > < b r / > < c o d e > G r o u p 1 : < b r / > ├ ─ ─ G r o u p 2 : < b r / > │ ├ ─ ─ R e c t a n g l e 1 < b r / > │ ├ ─ ─ R e c t a n g l e 2 < b r / > │ └ ─ ─ L i n e ( c o n n e c t i n g R e c t a n g l e 1 a n d R e c t a n g l e 2 ) < b r / > └ ─ ─ G r o u p 3 : < b r / > ├ ─ ─ R e c t a n g l e 3 < b r / > └ ─ ─ R e c t a n g l e 4 < b r / > < / c o d e > < b r / > П о к а з а н о в ф о р м а т е p p t : < / p > < b r / > < i m g a l t = " э л е м е н т ы г р у п п ы P o w e r P o i n t " s r c = " h t t p s : / / i . s s t a t i c . n e t / L h e D 6 w p d . p n g " / > < / p > < b r / > П о к а з а н о в ф о р м а т е l i d e s . x m l < / c o d e > : < / p > < b r / > < d i v c l a s s = " s n i p p e t " > < b r / > < d i v c l a s s = " s n i p p e t - c o d e " > < b r / > < p r e c l a s s = " s n i p p e t - c o d e - h t m l l a n g - h t m l P r e t t y p r i n t - o v e r r i d e " > < c o d e > & l t ; ? x m l v e r s i o n = " 1 . 0 " e n c o d i n g = " U T F - 8 " s t a n d a l o n e = " y e s " ? & g t ; < b r / > & l t ; p : s l d x m l n s : a = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / d r a w i n g m l / 2 0 0 6 / m a i n " x m l n s : r = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / o f f i c e D o c u m e n t / 2 0 0 6 / r e l a t i o n s h i p s " x m l n s : p = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / p r e s e n t a t i o n m l / 2 0 0 6 / m a i n " & g t ; < b r / > & l t ; p : c S l d & g t ; < b r / > & l t ; p : s p T r e e & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 " n a m e = " " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 0 " y = " 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 0 " c y = " 0 " / & g t ; < b r / > & l t ; a : c h O f f x = " 0 " y = " 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 0 " c y = " 0 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : g r p S p & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 4 " n a m e = " g r o u p 1 3 " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 5 4 8 6 4 0 0 " c y = " 3 4 2 2 4 6 9 " / & g t ; < b r / > & l t ; a : c h O f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 5 4 8 6 4 0 0 " c y = " 3 4 2 2 4 6 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : g r p S p & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 2 " n a m e = " g r o u p 1 1 " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 5 4 8 6 4 0 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; a : c h O f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 5 4 8 6 4 0 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : s p & g t ; < b r / > & l t ; p : n v S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 4 " n a m e = " r e c t a n g l e 3 " / & g t ; < b r / > & l t ; p : c N v S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 2 0 1 1 6 8 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " r e c t " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 2 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " & g t ; < b r / > & l t ; a : s h a d e v a l = " 5 0 0 0 0 " / & g t ; < b r / > & l t ; / a : s c h e m e C l r & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : e f f e c t R e f & g t ; < b r / > & l t ; a : f o n t R e f i d x = " m i n o r " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " l t 1 " / & g t ; < b r / > & l t ; / a : f o n t R e f & g t ; < b r / > & l t ; / p : s t y l e & g t ; < b r / > & l t ; p : t x B o d y & g t ; < b r / > & l t ; a : b o d y P r r t l C o l = " 0 " a n c h o r = " c t r " / & g t ; < b r / > & l t ; a : l s t S t y l e / & g t ; < b r / > & l t ; a : p & g t ; < b r / > & l t ; a : p P r a l g n = " c t r " / & g t ; < b r / > & l t ; a : e n d P a r a R P r l a n g = " z h - C N " a l t L a n g = " e n - U S " / & g t ; < b r / > & l t ; / a : p & g t ; < b r / > & l t ; / p : t x B o d y & g t ; < b r / > & l t ; / p : s p & g t ; < b r / > & l t ; p : s p & g t ; < b r / > & l t ; p : n v S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 5 " n a m e = " r e c t a n g l e 4 " / & g t ; < b r / > & l t ; p : c N v S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 4 9 9 0 0 1 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 2 0 1 1 6 8 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " r e c t " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 2 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " & g t ; < b r / > & l t ; a : s h a d e v a l = " 5 0 0 0 0 " / & g t ; < b r / > & l t ; / a : s c h e m e C l r & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : e f f e c t R e f & g t ; < b r / > & l t ; a : f o n t R e f i d x = " m i n o r " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " l t 1 " / & g t ; < b r / > & l t ; / a : f o n t R e f & g t ; < b r / > & l t ; / p : s t y l e & g t ; < b r / > & l t ; p : t x B o d y & g t ; < b r / > & l t ; a : b o d y P r r t l C o l = " 0 " a n c h o r = " c t r " / & g t ; < b r / > & l t ; a : l s t S t y l e / & g t ; < b r / > & l t ; a : p & g t ; < b r / > & l t ; a : p P r a l g n = " c t r " / & g t ; < b r / > & l t ; a : e n d P a r a R P r l a n g = " z h - C N " a l t L a n g = " e n - U S " / & g t ; < b r / > & l t ; / a : p & g t ; < b r / > & l t ; / p : t x B o d y & g t ; < b r / > & l t ; / p : s p & g t ; < b r / > & l t ; p : c x n S p & g t ; < b r / > & l t ; p : n v C x n S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 8 " n a m e = " D i r e c t a r r o w c o n n e c t o r 7 " / & g t ; < b r / > & l t ; p : c N v C x n S p P r & g t ; < b r / > & l t ; a : s t C x n i d = " 4 " i d x = " 3 " / & g t ; < b r / > & l t ; a : e n d C x n i d = " 5 " i d x = " 1 " / & g t ; < b r / > & l t ; / p : c N v C x n S p P r & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v C x n S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 3 5 2 6 9 7 1 " y = " 2 5 3 4 1 9 5 " / & g t ; < b r / > & l t ; a : e x t c x = " 1 4 6 3 0 4 0 " c y = " 0 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " s t r a i g h t C o n n e c t o r 1 " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; a : l n & g t ; < b r / > & l t ; a : t a i l E n d t y p e = " t r i a n g l e " / & g t ; < b r / > & l t ; / a : l n & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t1" />
Текущее поведение
VSTO может найти только все элементы внутри группы 1, но не может обнаружить, что группы 2 и группа 3 существуют как вложенные группы.
Результирующая структура JSON сглаживается, теряя иерархические отношения:
Группа2 и Группа3 должна определяться как вложенные группы в Группу1
JSON должен сохранять иерархическую структуру
Примечание: Я проверил это python-pptx может успешно обнаруживать и анализировать эти вложенные групповые отношения, поэтому данные существуют в файловой структуре.
Что я пробовал:
Отладка в Visual Studio: поиск по доступным API VSTO, но не удалось найти способ доступа к вложенным группам.
Подход сопоставления идентификаторов: попытка сопоставить идентификаторы групп фигур с идентификаторами родительских групп, но это не удалось.
Возможные решения
Одним из возможных подходов является непосредственный анализ XML-файла PowerPoint (аналогично тому, как работает python-pptx) для извлечения групповых связей.
Однако для этого потребуется:
Понимание XML-структуры PPTX
Реализация пользовательского анализа XML логика
Поддержание совместимости с различными версиями PowerPoint
Вопрос
Есть ли API или метод VSTO для обнаружения вложенных групп в PowerPoint, которого мне не хватает? Или непосредственный анализ XML является единственным жизнеспособным решением?
VSTO не может захватывать вложенные группы в слайдах PowerPoint. Например, р а с с м о т р и м с л е д у ю щ у ю с т р у к т у р у : < / p > < b r / > < c o d e > G r o u p 1 : < b r / > ├ ─ ─ G r o u p 2 : < b r / > │ ├ ─ ─ R e c t a n g l e 1 < b r / > │ ├ ─ ─ R e c t a n g l e 2 < b r / > │ └ ─ ─ L i n e ( c o n n e c t i n g R e c t a n g l e 1 a n d R e c t a n g l e 2 ) < b r / > └ ─ ─ G r o u p 3 : < b r / > ├ ─ ─ R e c t a n g l e 3 < b r / > └ ─ ─ R e c t a n g l e 4 < b r / > < / c o d e > < b r / > П о к а з а н о в ф о р м а т е p p t : < / p > < b r / > < i m g a l t = " э л е м е н т ы г р у п п ы P o w e r P o i n t " s r c = " h t t p s : / / i . s s t a t i c . n e t / L h e D 6 w p d . p n g " / > < / p > < b r / > П о к а з а н о в ф о р м а т е l i d e s . x m l < / c o d e > : < / p > < b r / > < d i v c l a s s = " s n i p p e t " > < b r / > < d i v c l a s s = " s n i p p e t - c o d e " > < b r / > < p r e c l a s s = " s n i p p e t - c o d e - h t m l l a n g - h t m l P r e t t y p r i n t - o v e r r i d e " > < c o d e > & l t ; ? x m l v e r s i o n = " 1 . 0 " e n c o d i n g = " U T F - 8 " s t a n d a l o n e = " y e s " ? & g t ; < b r / > & l t ; p : s l d x m l n s : a = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / d r a w i n g m l / 2 0 0 6 / m a i n " x m l n s : r = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / o f f i c e D o c u m e n t / 2 0 0 6 / r e l a t i o n s h i p s " x m l n s : p = " h t t p : / / s c h e m a s . o p e n x m l f o r m a t s . o r g / p r e s e n t a t i o n m l / 2 0 0 6 / m a i n " & g t ; < b r / > & l t ; p : c S l d & g t ; < b r / > & l t ; p : s p T r e e & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 " n a m e = " " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 0 " y = " 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 0 " c y = " 0 " / & g t ; < b r / > & l t ; a : c h O f f x = " 0 " y = " 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 0 " c y = " 0 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : g r p S p & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 4 " n a m e = " g r o u p 1 3 " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 5 4 8 6 4 0 0 " c y = " 3 4 2 2 4 6 9 " / & g t ; < b r / > & l t ; a : c h O f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 5 4 8 6 4 0 0 " c y = " 3 4 2 2 4 6 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : g r p S p & g t ; < b r / > & l t ; p : n v G r p S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 1 2 " n a m e = " g r o u p 1 1 " / & g t ; < b r / > & l t ; p : c N v G r p S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v G r p S p P r & g t ; < b r / > & l t ; p : g r p S p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 5 4 8 6 4 0 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; a : c h O f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : c h E x t c x = " 5 4 8 6 4 0 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; / p : g r p S p P r & g t ; < b r / > & l t ; p : s p & g t ; < b r / > & l t ; p : n v S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 4 " n a m e = " r e c t a n g l e 3 " / & g t ; < b r / > & l t ; p : c N v S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 1 5 1 5 2 9 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 2 0 1 1 6 8 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " r e c t " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 2 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " & g t ; < b r / > & l t ; a : s h a d e v a l = " 5 0 0 0 0 " / & g t ; < b r / > & l t ; / a : s c h e m e C l r & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : e f f e c t R e f & g t ; < b r / > & l t ; a : f o n t R e f i d x = " m i n o r " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " l t 1 " / & g t ; < b r / > & l t ; / a : f o n t R e f & g t ; < b r / > & l t ; / p : s t y l e & g t ; < b r / > & l t ; p : t x B o d y & g t ; < b r / > & l t ; a : b o d y P r r t l C o l = " 0 " a n c h o r = " c t r " / & g t ; < b r / > & l t ; a : l s t S t y l e / & g t ; < b r / > & l t ; a : p & g t ; < b r / > & l t ; a : p P r a l g n = " c t r " / & g t ; < b r / > & l t ; a : e n d P a r a R P r l a n g = " z h - C N " a l t L a n g = " e n - U S " / & g t ; < b r / > & l t ; / a : p & g t ; < b r / > & l t ; / p : t x B o d y & g t ; < b r / > & l t ; / p : s p & g t ; < b r / > & l t ; p : s p & g t ; < b r / > & l t ; p : n v S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 5 " n a m e = " r e c t a n g l e 4 " / & g t ; < b r / > & l t ; p : c N v S p P r / & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 4 9 9 0 0 1 1 " y = " 1 8 2 8 8 0 0 " / & g t ; < b r / > & l t ; a : e x t c x = " 2 0 1 1 6 8 0 " c y = " 1 4 1 0 7 8 9 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " r e c t " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 2 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " & g t ; < b r / > & l t ; a : s h a d e v a l = " 5 0 0 0 0 " / & g t ; < b r / > & l t ; / a : s c h e m e C l r & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : e f f e c t R e f & g t ; < b r / > & l t ; a : f o n t R e f i d x = " m i n o r " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " l t 1 " / & g t ; < b r / > & l t ; / a : f o n t R e f & g t ; < b r / > & l t ; / p : s t y l e & g t ; < b r / > & l t ; p : t x B o d y & g t ; < b r / > & l t ; a : b o d y P r r t l C o l = " 0 " a n c h o r = " c t r " / & g t ; < b r / > & l t ; a : l s t S t y l e / & g t ; < b r / > & l t ; a : p & g t ; < b r / > & l t ; a : p P r a l g n = " c t r " / & g t ; < b r / > & l t ; a : e n d P a r a R P r l a n g = " z h - C N " a l t L a n g = " e n - U S " / & g t ; < b r / > & l t ; / a : p & g t ; < b r / > & l t ; / p : t x B o d y & g t ; < b r / > & l t ; / p : s p & g t ; < b r / > & l t ; p : c x n S p & g t ; < b r / > & l t ; p : n v C x n S p P r & g t ; < b r / > & l t ; p : c N v P r i d = " 8 " n a m e = " D i r e c t a r r o w c o n n e c t o r 7 " / & g t ; < b r / > & l t ; p : c N v C x n S p P r & g t ; < b r / > & l t ; a : s t C x n i d = " 4 " i d x = " 3 " / & g t ; < b r / > & l t ; a : e n d C x n i d = " 5 " i d x = " 1 " / & g t ; < b r / > & l t ; / p : c N v C x n S p P r & g t ; < b r / > & l t ; p : n v P r / & g t ; < b r / > & l t ; / p : n v C x n S p P r & g t ; < b r / > & l t ; p : s p P r & g t ; < b r / > & l t ; a : x f r m & g t ; < b r / > & l t ; a : o f f x = " 3 5 2 6 9 7 1 " y = " 2 5 3 4 1 9 5 " / & g t ; < b r / > & l t ; a : e x t c x = " 1 4 6 3 0 4 0 " c y = " 0 " / & g t ; < b r / > & l t ; / a : x f r m & g t ; < b r / > & l t ; a : p r s t G e o m p r s t = " s t r a i g h t C o n n e c t o r 1 " & g t ; < b r / > & l t ; a : a v L s t / & g t ; < b r / > & l t ; / a : p r s t G e o m & g t ; < b r / > & l t ; a : l n & g t ; < b r / > & l t ; a : t a i l E n d t y p e = " t r i a n g l e " / & g t ; < b r / > & l t ; / a : l n & g t ; < b r / > & l t ; / p : s p P r & g t ; < b r / > & l t ; p : s t y l e & g t ; < b r / > & l t ; a : l n R e f i d x = " 1 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : l n R e f & g t ; < b r / > & l t ; a : f i l l R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t 1 " / & g t ; < b r / > & l t ; / a : f i l l R e f & g t ; < b r / > & l t ; a : e f f e c t R e f i d x = " 0 " & g t ; < b r / > & l t ; a : s c h e m e C l r v a l = " a c c e n t1" />
[b]Текущее поведение[/b] [list] [*]VSTO может найти только все элементы внутри группы 1, но не может обнаружить, что группы 2 и группа 3 существуют как вложенные группы. [*]Результирующая структура JSON сглаживается, теряя иерархические отношения: [code]{ "group1": { "child_elements": [ "rectangle1", "rectangle2", "line1", "rectangle3", "rectangle4" ] } }
[/code]
[/list] [b]Ожидаемое поведение[/b] [list] [*]Группа2 и Группа3 должна определяться как вложенные группы в Группу1 [*]JSON должен сохранять иерархическую структуру [/list] [b]Примечание:[/b] Я проверил это python-pptx может успешно обнаруживать и анализировать эти вложенные групповые отношения, поэтому данные существуют в файловой структуре. Что я пробовал: [list] [*]Отладка в Visual Studio: поиск по доступным API VSTO, но не удалось найти способ доступа к вложенным группам. [*]Подход сопоставления идентификаторов: попытка сопоставить идентификаторы групп фигур с идентификаторами родительских групп, но это не удалось. [/list] [b]Возможные решения[/b] Одним из возможных подходов является непосредственный анализ XML-файла PowerPoint (аналогично тому, как работает python-pptx) для извлечения групповых связей. Однако для этого потребуется: [list] [*]Понимание XML-структуры PPTX [*]Реализация пользовательского анализа XML логика [*]Поддержание совместимости с различными версиями PowerPoint [/list] [b]Вопрос[/b] Есть ли API или метод VSTO для обнаружения вложенных групп в PowerPoint, которого мне не хватает? Или непосредственный анализ XML является единственным жизнеспособным решением?