前の関連記事:LibreOffice(52)サービス辞書とインターフェイス辞書の結果を図に書く
LibreOffice(51)クラスにすると関数の引数が減らせたで多分木でいけそう、と気づいてから、まず二分木を学習したら再帰がでてきて、再帰は学習しても使いこなせず再帰を除去する方法を学習して、また二分木に戻って出力の仕方を学んでようやくここまで戻ってきました。2ヶ月も寄り道。
階層のスタックも追加する
libreoffice53.py
2ヶ月もの学習の効果がありinorder(通りがけ順)で出力することによって、前回の図の通りの順に出力できました。
起点となるサービスやインターフェイスを特定するのに10行目から29行目までを費やしていますが、ちょっとこれ以上簡略化する方法を思いつきませんでした。
inorderで出力するときにも同じことをしている部分があるので無駄が生じています。
まあ以前の辞書を使う方法よりは格段に効率的になっていると思いますけど。
このままでは見にくいのでまずは階層を記録するスタックも追加してインデントをつけて出力させます。
二分木では根を階層0として、親ノードから子ノードへ階層が上がっていきました。
今回はサブクラス(子)から始まってスーパークラス(親)へと階層を上げています。
libreoffice53.py
これでインデントつきで出力できました。
枝をつけます。
libreoffice53.py
あっさりできましたね。
Python(24)preorder(行きかけ順)inorder(通りがけ順)postorder(帰りがけ順)の比較のpreorder(行きかけ順)のtree_repr()の枝出力部分を少し修正するだけで使えました。
二分木のときと違って空のノードというのがないので楽ですね。
出力例を載せておきます。
Writerドキュメントについて実行。
com.sun.star.text.TextDocument
└─com.sun.star.text.GenericTextDocument
├─com.sun.star.beans.XPropertySet
├─com.sun.star.lang.XMultiServiceFactory
├─com.sun.star.style.XStyleFamiliesSupplier
├─com.sun.star.text.XBookmarksSupplier
├─com.sun.star.text.XChapterNumberingSupplier
├─com.sun.star.text.XDocumentIndexesSupplier
├─com.sun.star.text.XEndnotesSupplier
├─com.sun.star.text.XFootnotesSupplier
├─com.sun.star.text.XPagePrintable
├─com.sun.star.text.XReferenceMarksSupplier
├─com.sun.star.text.XTextDocument
│ └─com.sun.star.frame.XModel
│ └─com.sun.star.lang.XComponent
├─com.sun.star.text.XTextEmbeddedObjectsSupplier
├─com.sun.star.text.XTextFieldsSupplier
├─com.sun.star.text.XTextFramesSupplier
├─com.sun.star.text.XTextGraphicObjectsSupplier
├─com.sun.star.text.XTextSectionsSupplier
├─com.sun.star.text.XTextTablesSupplier
├─com.sun.star.util.XNumberFormatsSupplier
├─com.sun.star.util.XRefreshable
├─com.sun.star.util.XReplaceable
├─com.sun.star.util.XSearchable
└─com.sun.star.document.OfficeDocument
├─com.sun.star.document.XDocumentEventBroadcaster
├─com.sun.star.document.XDocumentPropertiesSupplier
├─com.sun.star.document.XEmbeddedScripts
├─com.sun.star.document.XEventBroadcaster
├─com.sun.star.document.XEventsSupplier
├─com.sun.star.document.XUndoManagerSupplier
├─com.sun.star.document.XViewDataSupplier
├─com.sun.star.frame.XStorable
├─com.sun.star.util.XModifiable
│ └─com.sun.star.util.XModifyBroadcaster
├─com.sun.star.view.XPrintJobBroadcaster
└─com.sun.star.view.XPrintable
Calcドキュメントについて出力。
com.sun.star.sheet.SpreadsheetDocument
├─com.sun.star.document.XActionLockable
├─com.sun.star.document.XLinkTargetSupplier
├─com.sun.star.drawing.XDrawPagesSupplier
├─com.sun.star.frame.XModel
│ └─com.sun.star.lang.XComponent
├─com.sun.star.lang.XMultiServiceFactory
├─com.sun.star.sheet.XCalculatable
├─com.sun.star.sheet.XConsolidatable
├─com.sun.star.sheet.XDocumentAuditing
├─com.sun.star.sheet.XGoalSeek
├─com.sun.star.sheet.XSpreadsheetDocument
├─com.sun.star.style.XStyleFamiliesSupplier
├─com.sun.star.util.XNumberFormatsSupplier
├─com.sun.star.util.XProtectable
├─com.sun.star.document.OfficeDocument
│ ├─com.sun.star.document.XDocumentEventBroadcaster
│ ├─com.sun.star.document.XDocumentPropertiesSupplier
│ ├─com.sun.star.document.XEmbeddedScripts
│ ├─com.sun.star.document.XEventBroadcaster
│ ├─com.sun.star.document.XEventsSupplier
│ ├─com.sun.star.document.XUndoManagerSupplier
│ ├─com.sun.star.document.XViewDataSupplier
│ ├─com.sun.star.frame.XStorable
│ ├─com.sun.star.util.XModifiable
│ │ └─com.sun.star.util.XModifyBroadcaster
│ ├─com.sun.star.view.XPrintJobBroadcaster
│ └─com.sun.star.view.XPrintable
└─com.sun.star.sheet.SpreadsheetDocumentSettings
└─com.sun.star.beans.XPropertySet
0 件のコメント:
コメントを投稿