├── .deploy-extras
└── macos
│ ├── IMPORTANT-README-BEFORE-RUNNING.txt
│ ├── fix-permissions-automator-app.zip
│ └── fix-permissions.command
├── .env
├── .github
└── workflows
│ ├── build-snap.yml
│ └── offline
│ ├── build-all-os-except-mac.yml
│ ├── build-all-os.yml
│ ├── build-mac.yml
│ ├── build-snap-18.04.yml
│ └── run-unittests.yml
├── .gitignore
├── .requirement-extras
├── buildwin_github-actions.iss
├── requirements-linux-22.txt
├── requirements-linux-common.txt
└── requirements-travis.txt
├── .travis.yml
├── .vscode
├── launch.json
├── pynsource-multi.code-workspace
└── settings.json
├── Admin
├── 2to3_Research.filelist.log
├── 2to3_Research.log
├── 2to3_src.filelist.log
├── 2to3_src.log
├── README.md
├── announcements
│ ├── Readme_deprecated.txt
│ ├── comp.lang.python.announce - Google Groups.url
│ ├── pynsource yahoo group.url
│ ├── web_macpedia_2012.png
│ └── web_modelling_blog_2012.png
├── bitly-releases
│ ├── bitly.py
│ └── requirements-bitlytool.txt
├── doco-uml
│ ├── Documentation on PyNSource models.docx
│ ├── Documentation on PyNSource models.odt
│ ├── OGL-like UML 2015.png
│ ├── Overlap Unit Test Visual Doco.docx
│ ├── ParsereportgenUML1.pdf
│ ├── UML pynsource - corelayout1.pdf
│ ├── UML pynsource - pynsourcegui1.pdf
│ ├── UML_pynsource parse01.pdf
│ ├── UML_pynsourceGUI.pdf
│ ├── UML_wxOGL.pdf
│ ├── comment nodes - UML class-sequence-combo diagram 2019.pdf
│ ├── epydoc_pynsource_proj1.prj
│ ├── gen_epydoc.bat
│ ├── gui_uml.plantuml
│ ├── gui_uml_01_sha_884410.png
│ ├── gui_uml_latest.png
│ ├── parse_model_uml.png
│ ├── pynsource 1 - overview uml july 2012.pdf
│ ├── pynsource 1.eap
│ ├── pynsource classentry dict 1.png
│ ├── pynsource devel notes scans.pdf
│ ├── pynsourceUML-2015.mic
│ ├── pynsourceUML-2015.pdf
│ └── uml_ascii_sideways1.txt
├── site-andypatterns
│ ├── AndyPatterns old Download.htm
│ ├── AndyPatterns old PyNSource - UML tool for Python.htm
│ ├── When 1.6 release old_pages_archived.html
│ └── yUml vs Ogl render 1.png
├── site-atug
│ ├── pynsource-latest-devel.txt
│ └── pynsource-latest.txt
├── site-sourceforge
│ ├── PyNSource Home on SourceForge.net.url
│ ├── readme moved to google.markdown
│ ├── sfmigrate.bat
│ └── sourceforge info misc.txt
├── svnlog.txt
└── todo
│ └── todo.txt
├── BUILDING.md
├── CHANGELOG.md
├── DOWNLOADS.md
├── INSTALL-TIPS.md
├── README.md
├── Research
├── async play
│ ├── frame_and_event_linux_bug.py
│ ├── report_snap_env.py
│ ├── repro_wxasync_042_bug.py
│ ├── requirements-linux.txt
│ ├── rubber_band_async.py
│ ├── simplest_wxapp.py
│ ├── simplest_wxapp_with_menu.py
│ ├── snapcraft-verbose.yaml
│ ├── snapcraft.yaml
│ ├── turtle_avoidance_all.py
│ ├── turtle_avoidance_oninit_all.py
│ ├── turtle_avoidance_oninit_coroutine.py
│ ├── wxasync041.py
│ ├── wxasync042.py
│ ├── wxasync1.py
│ ├── wxasync_local.py
│ └── wxasync_official_bug.py
├── config techniques
│ ├── pynsource.ini
│ └── testConfigObj.py
├── hexmvc
│ ├── .vscode
│ │ └── settings.json
│ ├── Overview of HexMVC.txt
│ ├── architecture2
│ │ ├── architecture1.py
│ │ ├── architecture2.py
│ │ ├── architecture2_gui_formbuilder - broken.fbp
│ │ ├── architecture2_gui_formbuilder.fbp
│ │ └── architecture2_gui_gen.py
│ ├── architecture3
│ │ ├── App.py
│ │ ├── AppMainConfigDotnet
│ │ │ ├── AppMainConfigDotnet.sln
│ │ │ ├── AppMainConfigDotnetWinForm.pyproj
│ │ │ ├── Program.py
│ │ │ ├── ServerDotnet.py
│ │ │ ├── ServerDotnetAdapter.py
│ │ │ ├── UtilJsonDotnetAdapter.py
│ │ │ ├── UtilRandomDotnetAdapter.py
│ │ │ ├── ViewDotnetWinForm.py
│ │ │ ├── ViewDotnetWinForm.resx
│ │ │ ├── ViewDotnetWinFormAdapter.py
│ │ │ ├── app.config
│ │ │ ├── app_python_location_TEMPLATE.config
│ │ │ ├── lib_andy_python
│ │ │ │ ├── IronPython.Modules.dll
│ │ │ │ ├── IronPython.Modules.xml
│ │ │ │ ├── IronPython.dll
│ │ │ │ ├── IronPython.xml
│ │ │ │ ├── Microsoft.Dynamic.dll
│ │ │ │ ├── Microsoft.Scripting.Metadata.dll
│ │ │ │ └── Microsoft.Scripting.dll
│ │ │ └── run.bat
│ │ ├── AppMainConfigOo.py
│ │ ├── AppMainConfigSql.py
│ │ ├── Controller.py
│ │ ├── ModelAdapterBase.py
│ │ ├── ModelOo.py
│ │ ├── ModelOoAdapter.py
│ │ ├── ModelSql.py
│ │ ├── ModelSqlAdapter.py
│ │ ├── PersistenceOoHomegrown.py
│ │ ├── PersistenceOoPickle.py
│ │ ├── ServerBottleAdapter.py
│ │ ├── ServerMockAdapter.py
│ │ ├── UtilJsonStdpythonAdapter.py
│ │ ├── UtilRandomStdpythonAdapter.py
│ │ ├── ViewWx.fbp
│ │ ├── ViewWx.py
│ │ ├── ViewWxAdapter.py
│ │ └── arch3.eap
│ ├── bottle tests
│ │ ├── bottle1.py
│ │ ├── bottle1_bug.py
│ │ ├── bottle3.py
│ │ └── flask1.py
│ ├── grand unified
│ │ └── listing1.py
│ ├── hexagon3
│ │ ├── favicon.ico
│ │ ├── hexagon1.py
│ │ ├── hexagon2.py
│ │ ├── hexagon3.py
│ │ ├── hexapp.py
│ │ ├── hexappmodel.py
│ │ ├── hexmodel_simple.py
│ │ ├── hexmodel_sqlobject.py
│ │ ├── hexmvc uml01.txt
│ │ ├── hexmvcgui.py
│ │ ├── hexmvcgui_formbuilder.fbp
│ │ ├── hexmvcgui_gen.py
│ │ ├── hexpersistence.py
│ │ ├── hexpersistence_sqlobject.py
│ │ ├── hexserver.py
│ │ ├── junk.py
│ │ ├── scraps.fbp
│ │ ├── scraps.py
│ │ ├── scrapswx.py
│ │ ├── test1.fbp
│ │ ├── tests
│ │ │ └── test_hexmvc01.py
│ │ └── views
│ │ │ ├── ajax1.tpl
│ │ │ └── hello_template.tpl
│ ├── lib
│ │ └── architecture_support.py
│ ├── orm copycat test
│ │ ├── copycat1.py
│ │ └── files
│ │ │ ├── copycat.log
│ │ │ ├── snapshot_000000000000002.dat
│ │ │ └── transaction_000000000000003.log
│ ├── orm sqlobject test
│ │ ├── Download SQLObject.url
│ │ ├── andyormtest1.db
│ │ └── andyormtest1.py
│ └── puremv_minimal_to_hexmvc
│ │ ├── puremvcminimalwx0nostartupcmd.py
│ │ ├── puremvcminimalwx1_puremvc_stripped_out.py
│ │ └── puremvcminimalwx2_as_hexmvc.py
├── joint
│ ├── joint2019
│ │ ├── backbone.js
│ │ ├── fullscreen_bug.py
│ │ ├── joint.css
│ │ ├── joint.js
│ │ ├── joint.py
│ │ ├── joint.shapes.uml.js
│ │ ├── joint_uml_big1.html
│ │ ├── jquery.js
│ │ ├── lodash.js
│ │ ├── umlcd.css
│ │ └── umlcd.js
│ ├── old_0.4
│ │ ├── joint.all.min.js
│ │ ├── joint_andy1.html
│ │ └── joint_andy2.html
│ └── uml_1
│ │ ├── joint.css
│ │ ├── joint.js
│ │ ├── joint.shapes.uml.js
│ │ └── joint_uml1.html
├── layout force spring
│ ├── Test Graphs
│ │ ├── graph b2 vs d42.txt
│ │ ├── graph big 01.txt
│ │ ├── graph big 02.txt
│ │ ├── graph for unit tests 1.txt
│ │ ├── graph line overlap 1.txt
│ │ ├── graph line overlap little 1.txt
│ │ ├── graph line overlap little 2.txt
│ │ ├── graph line overlap little 2a.txt
│ │ ├── graph line overlap little 2b.txt
│ │ ├── graph line overlap little 2c.txt
│ │ ├── graph snug up.txt
│ │ ├── graph spring 1.txt
│ │ ├── graph spring 2.txt
│ │ ├── graph spring 3.txt
│ │ ├── graph stress1.txt
│ │ ├── graph tangle1.txt
│ │ ├── graph tangle2 simple.txt
│ │ ├── graph weight1.txt
│ │ ├── graph weight2.txt
│ │ ├── graph1.txt
│ │ ├── graph2.txt
│ │ └── jumbled3.txt
│ ├── geometry_experiments.py
│ ├── gui.py
│ ├── gui_text.py
│ ├── html-js-sketches-fun
│ │ ├── box-layout1.html
│ │ ├── box-layout2.html
│ │ ├── box-layout3.html
│ │ └── box-layout4.html
│ ├── ori javascript
│ │ ├── graph.js
│ │ ├── index.html
│ │ └── prototype-1.4.0.js
│ ├── somepythonbug1.py
│ └── test1.sqlite3
├── misc information and doco
│ ├── Coordinate System Used in PynSource Gui.txt
│ ├── PyNSource.png
│ ├── VisualPython by Guido 1994 talk.txt
│ ├── Website - parseme java source for pic generation
│ │ ├── Blah.java
│ │ ├── ParseMeTest.java
│ │ ├── ParseMeTest2.java
│ │ └── variant.java
│ ├── ppcomp.py
│ ├── project names.txt
│ ├── pyNSourceUML_example01.gif
│ ├── pyNsourceGuiReversingItself01.gif
│ ├── pynsource gui doodlings on coord systems.pdf
│ ├── tokeniser google doco good short 01.htm
│ ├── tokenize.htm
│ ├── what tokens mean - sample 01.txt
│ ├── what tokens mean - sample 02.txt
│ └── xmi spec - 03-05-02.pdf
├── misc
│ ├── IAN Online Conceptual Diagram Creator.url
│ ├── Jacobo draw2d files demo.html
│ ├── colorizePython.html
│ ├── colorizePython.py
│ ├── graph layout pictures.mic
│ └── prtok.py
├── networkx graphs
│ ├── README networkx install.txt
│ ├── WCC.pgn.bz2
│ ├── andylayoutuml.py
│ ├── atlas.py
│ ├── chess_masters.png
│ ├── chess_masters.py
│ ├── edgelist.utf-8
│ ├── weighted_graph.png
│ └── weighted_graph.py
├── ogl tests 01
│ ├── OGLlike.py
│ ├── OGLlike_original.py
│ ├── OGLlike_pylab.py
│ ├── andyOgl01_oldwx.py
│ ├── andyOgl02_oldwx.py
│ ├── images.py
│ ├── images_oldwx.py
│ ├── img_uml01.png
│ ├── ogl notes.txt
│ ├── ogl_andyshape1.py
│ ├── ogl_animate1.py
│ ├── ogl_animate1_threaded.py
│ ├── ogl_mousechasing.py
│ ├── ogl_official_demo1.py
│ ├── ogl_redraw_f_logic.py
│ ├── ogl_resize_frame1.py
│ ├── ogl_scroll1.py
│ ├── ogl_scroll2.py
│ ├── ogl_scroll3_gtk_virtarea_draw_bug.py
│ ├── ogl_scroll_for_maillist.py
│ ├── ogl_scroll_for_maillist2.py
│ ├── ogl_simple1.py
│ ├── ogl_simple2.py
│ ├── ogl_simple2_wxasync.py
│ ├── ogl_simple3.py
│ ├── ogllike_pylab_test.py
│ └── ogllike_uml.py
├── overlap_removal_server
│ ├── README.md
│ ├── client_example
│ │ ├── animated-move.js
│ │ ├── editing.js
│ │ ├── editing_offline.js
│ │ ├── index.html
│ │ ├── init.js
│ │ ├── package-lock.json
│ │ ├── remove-overlaps.js
│ │ └── settings.js
│ ├── flask_main.py
│ ├── misc
│ │ ├── animate_node.html
│ │ ├── flask_play.py
│ │ ├── notes-on-dbl-click.js
│ │ └── payload1.js
│ └── screenshots
│ │ ├── example_client.png
│ │ └── geogebra_debugging.png
├── parsing
│ ├── ast_and_typed_ast
│ │ ├── astbug_python3_8_regular_ast_ok.py
│ │ ├── astbug_python3_8_typed_ast_fails.py
│ │ └── astbug_python3_8_typed_ast_fails_simple.py
│ ├── codegen.py
│ ├── codegen_with_diagnostics.py
│ ├── issues_85_93_94_parsing
│ │ ├── demo.py
│ │ ├── issue_85_type_hint.py
│ │ ├── issue_93_subscript.py
│ │ ├── issue_94_walrus.py
│ │ └── type_hint_example.py
│ ├── misc_parsing_play1.py
│ └── pynsource-cli-deprecated.py
├── plantuml
│ ├── api_example1.txt
│ └── pynsource-plantuml-gui.py
├── python advanced
│ ├── command_invokers1.py
│ ├── decorator_dump_params1.py
│ ├── decorator_function_call_counter1.py
│ ├── decorator_function_call_counter2.py
│ ├── interfaces1.py
│ ├── interfaces2.py
│ ├── listdiff.py
│ ├── multicast.py
│ ├── multicast_csharp_style1.py
│ ├── multicast_csharp_style2 - threaded.py
│ ├── multicast_csharp_style2.py
│ ├── multicast_simplified_style2.py
│ └── properties1.py
├── run_research_guis.bat
├── state chart editor
│ ├── Adders.py
│ ├── Editor.py
│ ├── GUI.py
│ ├── Globals.py
│ ├── Handler.py
│ ├── Link.py
│ ├── Separator.py
│ ├── State.py
│ ├── Statechart.py
│ ├── TopHandler.py
│ ├── TransformHandlers.py
│ ├── Transition.py
│ ├── andy01.stt
│ ├── icon16win.ico
│ ├── junk.log
│ ├── junk.pdf
│ ├── junk.ps
│ ├── junk.stt
│ └── junk2.stt
├── winerack ogl and floatcanvas
│ ├── Moo.jpg
│ ├── fc_FloatCanvasDemo.py
│ ├── fc_MiniDemo.py
│ ├── fc_PolyEditor.py
│ ├── fc_ProcessDiagram.py
│ ├── fc_ScaleDemo.py
│ ├── fc_ScaledBitmap2Demo.py
│ ├── fc_world.dat
│ ├── myimages.py
│ ├── rackdesigner.py
│ └── rackdesignerFC.py
├── wx doco
│ ├── Custom CommandEvent in wxPython.url
│ ├── ImageInHtml.py
│ ├── ImageViewer0.py
│ ├── ImageViewer0a.py
│ ├── ImageViewer0b.py
│ ├── ImageViewer1_pil.py
│ ├── ImageViewer2.py
│ ├── ImageViewer3.py
│ ├── ImageViewer4.py
│ ├── ImageViewer4scaled.py
│ ├── ImageViewer6.py
│ ├── ImageViewer7.py
│ ├── ImageViewer7a.py
│ ├── ImageViewer7b.py
│ ├── Images
│ │ ├── Moo.jpg
│ │ ├── Physics-4.jpg
│ │ ├── SPLASHSCREEN.BMP
│ │ ├── SliderPuzzle.jpg
│ │ ├── fish1.png
│ │ ├── img_uml01.png
│ │ ├── outyuml.png
│ │ ├── outyuml_big.png
│ │ ├── pickle.jpg
│ │ ├── shader-ReflectiveBumpedVertexLit-0.jpg
│ │ └── w05_783sidebar.jpg
│ ├── LongRunning wx.gauge no while-loop.url
│ ├── LongRunningTasks - wxPyWiki.url
│ ├── MessageBox - MessageDialog - wxPython-users - Google Groups.url
│ ├── Moo.jpg
│ ├── Response from MessageDialog.url
│ ├── about01.py
│ ├── accelerator_bug.py
│ ├── aui library Advanced Generic Widgets v0.9.1 documentation.url
│ ├── bootstrap_for_wxdemos.py
│ ├── custom_dialog01.py
│ ├── drag-button.py
│ ├── frameshow1.py
│ ├── html_demo.py
│ ├── images.py
│ ├── inspector_mixin_play.py
│ ├── put_icon_in_taskbar.py
│ ├── python - wxPython- Making a scrollable DC - Stack Overflow.url
│ ├── rclick_popup_menu1.py
│ ├── resize_scroll_01.py
│ ├── resize_scroll_02.py
│ ├── rubber_band.py
│ ├── scroll_window_in_action1.py
│ ├── scrolling_panel01.py
│ ├── someStyledTextCtrl1.py
│ ├── someStyledTextCtrl2.py
│ ├── someStyledTextCtrl3.py
│ ├── someStyledTextCtrl4_spe1.py
│ ├── some_wxaui1.py
│ ├── some_wxaui2.py
│ ├── somedoodle.py
│ ├── somedoublebufferingdemo.py
│ ├── somelongthread1.py
│ ├── somelongthread1_main.py
│ ├── somelongthread2_yield.py
│ ├── somelongthread3_idle.py
│ ├── somelongthread4_easy.py
│ ├── somelongthread4_easy_interruptable.py
│ ├── somenotebook0.py
│ ├── somenotebook1.py
│ ├── somepanelswitcher1.py
│ ├── someplot1.py
│ ├── someplot2_scroll.py
│ ├── somesimple1.py
│ ├── syntax_highlighting.py
│ ├── wx Index.url
│ ├── wx.MessageDialog.url
│ ├── wx.ScrolledWindow.url
│ ├── wx.Window.url
│ ├── wx.lib.ogl.Diagram.url
│ ├── wx.lib.ogl.url
│ ├── wxOGL - wxPyWiki - MAIN EXAMPLES.url
│ ├── wxPython dialogs.url
│ ├── wxglade1
│ │ ├── wxgladeapp1.py
│ │ ├── wxgladeapp2.py
│ │ ├── wxglage1project.wxg
│ │ ├── wxglage2project.wxg
│ │ ├── wxglage2project.wxg.bak
│ │ └── wxglage3project.wxg
│ ├── wxpython Overview Of GDI.url
│ └── zoom_canvas2d-plugin.py
├── wx form builder
│ ├── 2019test1
│ │ ├── run.sh
│ │ ├── test1.fbp
│ │ ├── test1.py
│ │ ├── test1_gen.py
│ │ └── toucan.png
│ ├── Doco Custom Component.png
│ ├── Doco ogl Custom Component.png
│ ├── fbogl1.fbp
│ ├── fbogl1.py
│ ├── fbogl1_gen.py
│ ├── fbpyn1.fbp
│ ├── fbpyn1.py
│ ├── fbpyn1_gen.py
│ ├── fbpyn1_scintilla.py
│ ├── fbtest01.fbp
│ ├── fbtest01.py
│ ├── fbtest01_gen.py
│ ├── icons16
│ │ ├── katomic.png
│ │ ├── kcmprocessor.png
│ │ ├── kcmscsi.png
│ │ ├── kedit.png
│ │ └── khangman.png
│ ├── icons22
│ │ ├── kaboodleloop.png
│ │ ├── kalarm.png
│ │ ├── kalzium.png
│ │ ├── kcmmidi.png
│ │ ├── kcmprocessor.png
│ │ ├── kcmscsi.png
│ │ ├── kcontrol.png
│ │ ├── kedit.png
│ │ ├── khangman.png
│ │ ├── kmid.png
│ │ ├── kmoon.png
│ │ ├── kopete_offline.png
│ │ ├── kreversi.png
│ │ ├── package_development.png
│ │ ├── reload.png
│ │ ├── roll.png
│ │ └── tool_timer.png
│ ├── icons32
│ │ ├── kalzium.png
│ │ ├── kcmmidi.png
│ │ ├── kcmprocessor.png
│ │ ├── kcmscsi.png
│ │ ├── kcontrol.png
│ │ ├── kedit.png
│ │ ├── khangman.png
│ │ └── kmoon.png
│ ├── images.py
│ ├── someStyledTextCtrl2.py
│ ├── some_fb1.fbp
│ ├── some_fb1.py
│ ├── some_fb2.fbp
│ ├── some_fb2_1.py
│ ├── some_fb2_2.py
│ ├── some_fb2_2_altered.py
│ ├── some_fb2_3.py
│ ├── some_fb2_gen.py
│ ├── some_fb2_gen_altered.py
│ └── splitwin01.py
├── wxglade
│ ├── test1
│ │ ├── test1.wxg
│ │ └── wxglade_out.py
│ └── test2
│ │ ├── myout
│ │ ├── test2.py
│ │ └── test2.wxg
└── yuml_python
│ ├── chromium launch idea.txt
│ ├── copypng.py
│ ├── create_yuml_class_diagram.py
│ ├── example yuml1.txt
│ ├── order.bat
│ ├── outyuml2.png
│ ├── png.py
│ ├── pynsource-yuml-gui.py
│ ├── pynsource1.bat
│ ├── pynsource2.bat
│ ├── pynsource3.bat
│ ├── read_yuml_from_png.py
│ ├── sample_pynsource_yuml.txt
│ ├── write_end_of_png.py
│ ├── yuml_order_example.png
│ ├── yuml_pynsource1_example.png
│ ├── yuml_pynsource2_example.png
│ └── yuml_pynsource3_example.png
├── bin
├── _buildmedia.sh
├── _buildsamples.py
├── blackall
├── build-package
├── build-snap
├── build-snap-clean
├── build-snap-clean-python-stuff
├── build-snap-debug
├── buildmac
├── buildwin.bat
├── install-linux-18.04
├── install-linux-20.04
├── install-linux-fedora-33
├── install-snap
├── lxd-containers-ls
├── lxd-shell
├── pip-install-ogl2-alsm-rego
├── pkill_python.command
├── publish-snap
├── r
├── run
├── run-py37
├── run-py38
├── run-snap
├── run-snap-with-shell
├── run-win10.bat
├── runpro
├── runpro-imac
├── runpro-linux
├── runpro-py37
├── runpro-py38
├── runpro-win10.bat
├── snap-bash-multipass
├── snap-build-multipass
├── snap-deploy
├── snap-expand-extensions
├── snap-install
├── snap-ls
├── snap-stopvm-multipass
├── snap-tree
├── testall
├── testall-win10.bat
├── testone
├── uninstall-snap
└── viewconfig
├── requirements.txt
├── setup.py
├── snap
├── gui
│ ├── pynsource.desktop
│ └── pynsource.png
├── local
│ ├── andy-diagnostics
│ │ └── report_snap_env.py
│ └── snapcraft-18.04.yaml
└── snapcraft.yaml
├── src
├── .coveragerc
├── app
│ ├── __init__.py
│ ├── app.py
│ ├── cmds
│ │ ├── __init__.py
│ │ ├── base_cmd.py
│ │ ├── blackboard_frame.py
│ │ ├── blackboard_thread.py
│ │ ├── colouring.py
│ │ ├── deletion.py
│ │ ├── diagnostics.py
│ │ ├── filemgmt.py
│ │ ├── insertion.py
│ │ ├── layouts.py
│ │ ├── line_edge_type.py
│ │ └── selection.py
│ ├── controller.py
│ └── settings.py
├── ascii_uml
│ ├── __init__.py
│ ├── asciiworkspace.py
│ └── layout_ascii.py
├── bin
│ ├── covergui
│ ├── covertests
│ ├── testcli
│ └── testsingle
├── common
│ ├── __init__.py
│ ├── add_line_numbers.py
│ ├── approx_equal.py
│ ├── architecture_support.py
│ ├── command_pattern.py
│ ├── dialog_dir_path.py
│ ├── gui_imageviewer.py
│ ├── logger.py
│ ├── logwriter.py
│ ├── messages.py
│ ├── plantuml.py
│ ├── png.py
│ ├── printframework.py
│ ├── uml_colours.py
│ └── url_to_data.py
├── dialogs
│ ├── DialogChooseFromList.fbp
│ ├── DialogChooseFromList.py
│ ├── DialogChooseFromList_run.py
│ ├── DialogComment.fbp
│ ├── DialogComment.py
│ ├── DialogPlantUmlText.fbp
│ ├── DialogPlantUmlText.py
│ ├── DialogRego.fbp
│ ├── DialogRego.py
│ ├── DialogRego_run.py
│ ├── DialogUmlNodeEdit.fbp
│ ├── DialogUmlNodeEdit.fbp.bak
│ ├── DialogUmlNodeEdit.py
│ ├── DialogUmlNodeEdit_run.py
│ ├── FrameDeepLayout.fbp
│ ├── FrameDeepLayout.py
│ ├── FrameDeepLayout_run.py
│ ├── FramePyYuml.fbp
│ ├── FramePyYuml.py
│ ├── HelpWindow.fbp
│ ├── HelpWindow.html
│ ├── HelpWindow.py
│ ├── HelpWindow2.py
│ ├── __init__.py
│ └── help-images
│ │ ├── cytoscape.png
│ │ ├── gituml.jpg
│ │ ├── help-ascii.jpg
│ │ ├── help-colour.jpg
│ │ ├── help01.jpg
│ │ ├── plantuml01.jpg
│ │ └── pro.jpg
├── generate_code
│ ├── __init__.py
│ ├── gen_asciiart.py
│ ├── gen_base.py
│ ├── gen_delphi.py
│ ├── gen_java.py
│ ├── gen_plantuml.py
│ ├── gen_yuml.py
│ └── plantuml_html_scan.py
├── gui
│ ├── __init__.py
│ ├── canvas_resizer.py
│ ├── coord_utils.py
│ ├── node_edit_multi_purpose.py
│ ├── repair_ogl.py
│ ├── settings.py
│ ├── settings_wx.py
│ ├── shape_menu_mgr.py
│ ├── uml_canvas.py
│ ├── uml_lines.py
│ ├── uml_shape_handler.py
│ ├── uml_shapes.py
│ └── wx_log.py
├── layout
│ ├── __init__.py
│ ├── animation.py
│ ├── blackboard.py
│ ├── coordinate_mapper.py
│ ├── data_testgraphs.py
│ ├── layout_spring.py
│ ├── line_crosses_shape.py
│ ├── line_intersection.py
│ ├── overlap_removal.py
│ ├── permutations.py
│ └── snapshots.py
├── media
│ ├── about.png
│ ├── images.py
│ ├── pro.png
│ ├── pynsource.ico
│ └── pynsource.png
├── ogl
│ ├── __init__.py
│ ├── basic.py
│ ├── bmpshape.py
│ ├── canvas.py
│ ├── composit.py
│ ├── diagram.py
│ ├── divided.py
│ ├── drawn.py
│ ├── lines.py
│ └── oglmisc.py
├── parsing
│ ├── __init__.py
│ ├── alsm_set_module.py
│ ├── api.py
│ ├── class_entry.py
│ ├── core_parser_ast.py
│ ├── core_parser_old.py
│ ├── dump_pmodel.py
│ ├── keywords.py
│ ├── parse_rhs_analyser.py
│ ├── parse_source.py
│ └── quick_parse.py
├── pynsource_cli.py
├── pynsource_gui.py
├── samples
│ ├── __init__.py
│ ├── a simple example.pyns
│ ├── classic example.pyns
│ ├── composition relationship.pyns
│ ├── files_as_resource.py
│ ├── multi level inheritance.pyns
│ ├── nice diagram with comment.pyns
│ ├── simple inheritance.pyns
│ ├── the command pattern full.pyns
│ ├── the command pattern.pyns
│ ├── wx ogl architecture.pyns
│ └── wx ogl divided shape.pyns
├── tests
│ ├── __init__.py
│ ├── alltests.py
│ ├── misc manually run scripts
│ │ ├── run_pynsource_asciiart.bat
│ │ └── run_pynsource_yuml.bat
│ ├── python-in
│ │ ├── p2.py
│ │ ├── p3.py
│ │ ├── sort_attrs_example.py
│ │ ├── testmodule01.py
│ │ ├── testmodule02.py
│ │ ├── testmodule03.py
│ │ ├── testmodule04.py
│ │ ├── testmodule05.py
│ │ ├── testmodule06.py
│ │ ├── testmodule07.py
│ │ ├── testmodule08_multiple_inheritance.py
│ │ ├── testmodule09_intense.py
│ │ ├── testmodule10_old_cant_parse.py
│ │ ├── testmodule11_incoming_bugs.py
│ │ ├── testmodule66.py
│ │ ├── testmodule67clippy.py
│ │ ├── testmodule_asciiworkspace.py
│ │ ├── testmodule_bug_pyplecs.py
│ │ ├── testmodule_command_pattern.py
│ │ ├── testmodule_printframework.py
│ │ └── testmodule_pynsource.py
│ ├── readme-tests.md
│ ├── settings.py
│ ├── test_asciiworkspace_01.py
│ ├── test_asciiworkspace_02.py
│ ├── test_ast_quickparse.py
│ ├── test_coords.py
│ ├── test_displaymodel.py
│ ├── test_except.py
│ ├── test_graph_nodes.py
│ ├── test_java_delphi_gen.py
│ ├── test_overlaps1.py
│ ├── test_overlaps2stress.py
│ ├── test_parse_01.py
│ ├── test_parse_02.py
│ ├── test_parse_03.py
│ ├── test_parse_04.py
│ ├── test_parse_05.py
│ ├── test_parse_06.py
│ ├── test_parse_07.py
│ ├── test_parse_08.py
│ ├── test_parse_bugs_incoming.py
│ ├── test_parse_old_vs_new.py
│ ├── test_parse_plantuml.py
│ ├── test_parse_type_annotations.py
│ ├── test_parse_yuml_01.py
│ ├── test_persistence_01.py
│ ├── test_plantuml_html_scan.py
│ ├── test_quickparse_python.py
│ ├── test_rhs_analyser.py
│ ├── testing-generate-delphi
│ │ ├── delphi-out
│ │ │ ├── EventPlayAPI.pas
│ │ │ ├── PlayAPI.pas
│ │ │ ├── Playhead.pas
│ │ │ ├── PlayheadMediator.pas
│ │ │ ├── TestCase00.pas
│ │ │ ├── TestCase01.pas
│ │ │ ├── TestCase02.pas
│ │ │ ├── TimePlayAPI.pas
│ │ │ ├── TurnPlayAPI.pas
│ │ │ ├── UniqueList.pas
│ │ │ ├── unit_dict.pas
│ │ │ ├── unit_list.pas
│ │ │ └── unit_unittest.pas
│ │ ├── python-in
│ │ │ ├── playhead.py
│ │ │ ├── playheadmanager.py
│ │ │ └── utilcc.py
│ │ └── run.bat
│ └── testing-generate-java
│ │ ├── java-ide-import-results
│ │ ├── ea-JavaImportProj01.eap
│ │ ├── ea-enterprisearchitect-uml.pdf
│ │ ├── ea-enterprisearchitect01.emf
│ │ ├── ess-first import diagram ess model.xmi
│ │ ├── ess-pic01.png
│ │ └── ess-pic01.wmf
│ │ ├── java-out
│ │ ├── EventPlayAPI.java
│ │ ├── PlayAPI.java
│ │ ├── Playhead.java
│ │ ├── PlayheadMediator.java
│ │ ├── TestCase00.java
│ │ ├── TestCase01.java
│ │ ├── TestCase02.java
│ │ ├── TimePlayAPI.java
│ │ ├── TurnPlayAPI.java
│ │ ├── UniqueList.java
│ │ ├── dict.java
│ │ ├── list.java
│ │ ├── object.java
│ │ ├── unittest.java
│ │ └── variant.java
│ │ ├── python-in
│ │ ├── playhead.py
│ │ ├── playheadmanager.py
│ │ └── utilcc.py
│ │ └── run.bat
└── view
│ ├── __init__.py
│ ├── display_model.py
│ ├── graph.py
│ └── graph_persistence.py
└── tbump.toml
/.deploy-extras/macos/IMPORTANT-README-BEFORE-RUNNING.txt:
--------------------------------------------------------------------------------
1 | After you download and unzip the release, you need to give permission for the app to run on your machine.
2 | This is because the app is not signed via the Apple Developer program which would otherwise cost me USD $99 per year.
3 | To do this, open a terminal and type:
4 |
5 | xattr -dr com.apple.quarantine ~/Downloads/pynsource-macos-version-1.85/Pynsource.app
6 |
7 | otherwise
8 |
9 | 🎉 Easier Technique: Right click on the supplied bash script "fix-permissions.command" and choose "Open"
10 |
--------------------------------------------------------------------------------
/.deploy-extras/macos/fix-permissions-automator-app.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/.deploy-extras/macos/fix-permissions-automator-app.zip
--------------------------------------------------------------------------------
/.deploy-extras/macos/fix-permissions.command:
--------------------------------------------------------------------------------
1 | # Fix permissions on the .app because it is not signed (which would cost me approx AUD $150 each year)
2 | SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
3 | APP_NAME="Pynsource.app"
4 | APP=$SCRIPTPATH/$APP_NAME
5 | xattr -dr com.apple.quarantine $APP
6 | # check if error
7 | if [ $? -eq 0 ]; then
8 | echo "Success: $APP_NAME permissions fixed - you should be able to run it now"
9 | osascript -e 'display dialog "permissions fixed"'
10 | else
11 | echo "Error fixing permissions"
12 | osascript -e 'display dialog "Error fixing permissions"'
13 | fi
14 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | PYTHONPATH=src:${PYTHONPATH}
--------------------------------------------------------------------------------
/.github/workflows/build-snap.yml:
--------------------------------------------------------------------------------
1 | name: Pynsource Snap
2 | on:
3 | push:
4 | # branches: [ main ]
5 | tags: ['v*', 'pre*']
6 |
7 | # To trigger a build when above is set to tag
8 | # git tag -l
9 | # git tag -a v1.nn
10 | # git push --follow-tags
11 | jobs:
12 | build:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v3
16 |
17 | - uses: snapcore/action-build@v1
18 | id: snapcraft
19 |
20 | - uses: actions/upload-artifact@v3
21 | with:
22 | name: snap
23 | path: ${{ steps.snapcraft.outputs.snap }}
24 |
25 | # Uploads the snap to edge channel, test via: sudo snap refresh pynsource --edge
26 | # This fails because of symlink issues, hopefully snapcraft 7.3.1.post17+git8b3ed19b and later fix it
27 | #
28 | - name: Snap upload
29 | id: snapcraft_upload
30 | env:
31 | SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.snapcraft_store_credentials }}
32 | run: |
33 | snapcraft upload *.snap --release edge
34 |
--------------------------------------------------------------------------------
/.github/workflows/offline/build-snap-18.04.yml:
--------------------------------------------------------------------------------
1 | name: Pynsource Snap
2 |
3 | on:
4 | push:
5 | # branches: [ master ]
6 | # tags: ['build-test-*']
7 | tags: ['pre-*', 'version-*']
8 |
9 | jobs:
10 | my-snap-building-job:
11 | runs-on: ubuntu-18.04 # ubuntu-20.04 breaks
12 |
13 | steps:
14 | - name: Check out Git repository
15 | uses: actions/checkout@v2
16 |
17 | # https://github.com/marketplace/actions/snapcraft-action
18 | - name: Install Snapcraft, LXD and set Auth
19 | uses: samuelmeuli/action-snapcraft@v1
20 | with:
21 | use_lxd: true
22 | snapcraft_token: ${{ secrets.snapcraft_token }}
23 |
24 | # You can now run Snapcraft shell commands
25 | - name: Use Snapcraft - show help
26 | run: snapcraft --help
27 |
28 | - name: Build snap
29 | run: |
30 | sg lxd -c 'snapcraft --use-lxd'
31 | ls -l
32 | # unsquashfs -l *.snap
33 |
34 | - name: Save snap as artifact
35 | uses: actions/upload-artifact@v2
36 | with:
37 | name: snap_artifact
38 | path: ./*.snap
39 |
40 | # https://github.com/samuelmeuli/action-snapcraft/issues/28
41 | # Uploads the snap to edge channel, test via: sudo snap refresh pynsource --edge
42 | - name: Snap upload
43 | id: snapcraft
44 | run: |
45 | snapcraft upload *.snap --release edge
46 |
--------------------------------------------------------------------------------
/.github/workflows/offline/run-unittests.yml:
--------------------------------------------------------------------------------
1 | # Run unittests under multiple OS's and multiple Pythons.
2 | # I also have a travis integration running these same tests under Python 3.9 on xenial (Ubuntu 16.04) - see .travis.yml
3 | name: Unittests
4 | on:
5 | push:
6 | branches: [ master, gh-building ]
7 | pull_request:
8 | branches: [ master ]
9 | jobs:
10 | build:
11 | runs-on: ${{ matrix.os }}
12 |
13 | strategy:
14 | matrix:
15 | os: [ubuntu-latest, macos-latest, windows-latest]
16 | python-version: [3.6, 3.7, 3.8, 3.9]
17 |
18 | steps:
19 | - uses: actions/checkout@v2
20 | - name: Set up Python
21 | uses: actions/setup-python@v1
22 | with:
23 | python-version: ${{ matrix.python-version }}
24 | - name: Install dependencies
25 | run: |
26 | python -m pip install --upgrade pip
27 | pip install -r .requirement-extras/requirements-travis.txt
28 | - name: Test with unittest
29 | shell: bash
30 | run: |
31 | export TRAVIS=1
32 | sh -c 'cd src && mkdir tests/logs && ./bin/testall'
33 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | out.png
3 | venv*/
4 | .idea/
5 | dist/
6 | build/
7 | .eggs
8 | Research/wxglade/*/*~
9 | .coverage
10 | htmlcov/
11 | src/tests/logs/
12 | Research/wx doco/drag-button.spec
13 | .python-version
14 | *.snap
15 | junk*.py
16 | *.egg-info
17 | .flatpak-builder/
--------------------------------------------------------------------------------
/.requirement-extras/requirements-linux-22.txt:
--------------------------------------------------------------------------------
1 | # For linux users who want to install and actually build wxpython
2 | # which works on intel and also on linux on arm. You will first need to run
3 | # sudo apt-get install dpkg-dev build-essential python3-dev freeglut3-dev libgl1-mesa-dev libglu1-mesa-dev libgstreamer-plugins-base1.0-dev libgtk-3-dev libjpeg-dev libnotify-dev libpng-dev libsdl2-dev libsm-dev libtiff-dev libwebkit2gtk-4.0-dev libxtst-dev
4 | # and pip install attrdict3 (see https://github.com/wxWidgets/Phoenix/issues/2225)
5 | #wxPython>=4.0,<4.2.0 ; platform_system=="Linux" # See https://github.com/wxWidgets/Phoenix/issues/2225
6 | #wxPython==4.2.0 ; platform_system!="Linux"
7 | wxpython
8 |
9 | wxasync
10 | configobj
11 | requests
12 | typed_ast
13 | astpretty
14 | termcolor
15 | beautifultable
16 | appdirs
17 | wheel
18 | pydbg
19 | aiohttp
20 | async_lru
21 |
22 | Pillow
23 | py2app
24 | click
25 | #pytest
26 | #coverage
27 | #pytest-cov
28 | #black
29 |
--------------------------------------------------------------------------------
/.requirement-extras/requirements-linux-common.txt:
--------------------------------------------------------------------------------
1 | # linux users please use the script bin/install-linux-* and not this file
2 | configobj
3 | requests
4 | typed_ast
5 | astpretty
6 | termcolor
7 | beautifultable
8 | appdirs
9 | wheel
10 | pydbg
11 | aiohttp
12 | async_lru
13 |
14 | Pillow
15 | py2app
16 | click
17 | pytest
18 | coverage
19 | pytest-cov
20 | black
21 |
--------------------------------------------------------------------------------
/.requirement-extras/requirements-travis.txt:
--------------------------------------------------------------------------------
1 | # requirements for travis ci testing
2 | configobj
3 | requests
4 | typed_ast
5 | astpretty
6 | termcolor
7 | beautifultable
8 | appdirs
9 | pydbg
10 | aiohttp
11 | async_lru
12 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # need 'xenial' to get python 3.7 and over, otherwise travis defaults to 'trusty' which only goes to python 3.6
2 | dist: xenial
3 | language: python
4 | python: 3.9
5 | # command to install dependencies
6 | install: "pip install -r .requirement-extras/requirements-travis.txt"
7 | # command to run tests
8 | # script: sh -c 'cd src && mkdir tests/logs && ./bin/testall'
9 | script: sh -c 'mkdir src/tests/logs && ./bin/testall'
10 |
11 | # Set up notification options
12 | notifications:
13 | email:
14 | recipients:
15 | - abulka@gmail.com
16 | # change is when the repo status goes from pass to fail or vice versa
17 | on_success: change
18 | on_failure: always
19 |
20 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Python: Current File",
9 | "type": "python",
10 | "request": "launch",
11 | "program": "${file}",
12 | "console": "integratedTerminal",
13 | "justMyCode": true
14 | },
15 | {
16 | "name": "Python: pynsource",
17 | "type": "python",
18 | "request": "launch",
19 | "cwd": "${workspaceFolder}/src",
20 | "program": "pynsource_gui.py",
21 | "console": "integratedTerminal",
22 | "justMyCode": false
23 | },
24 | {
25 | "name": "Python: pynsource PRO",
26 | "type": "python",
27 | "request": "launch",
28 | "cwd": "${workspaceFolder}/src",
29 | "env": {
30 | "PYTHONPATH": "${workspaceFolder}/../ogl2:${workspaceFolder}/../pynsource-rego"
31 | },
32 | "program": "pynsource_gui.py",
33 | "console": "integratedTerminal",
34 | "justMyCode": true
35 | }
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/.vscode/pynsource-multi.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folders": [
3 | {
4 | "path": "/Users/Andy/Devel/pynsource"
5 | },
6 | {
7 | "path": "/Users/Andy/Devel/pynsource-rego"
8 | },
9 | {
10 | "path": "/Users/Andy/Devel/ogl2"
11 | },
12 | {
13 | "path": "/Users/Andy/Library/Preferences/PyNSource"
14 | },
15 | {
16 | "path": "/Users/Andy/Devel/pynsource-web"
17 | }
18 | ],
19 | "settings": {}
20 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.testing.unittestArgs": [
3 | "-v",
4 | "-s",
5 | "./src",
6 | "-p",
7 | "test_*.py"
8 | ],
9 | "python.testing.pytestEnabled": false,
10 | "python.testing.unittestEnabled": true
11 | }
--------------------------------------------------------------------------------
/Admin/announcements/comp.lang.python.announce - Google Groups.url:
--------------------------------------------------------------------------------
1 | [InternetShortcut]
2 | URL=http://groups.google.com/group/comp.lang.python.announce/topics
3 |
--------------------------------------------------------------------------------
/Admin/announcements/pynsource yahoo group.url:
--------------------------------------------------------------------------------
1 | [InternetShortcut]
2 | URL=http://tech.groups.yahoo.com/group/pynsource/
3 |
--------------------------------------------------------------------------------
/Admin/announcements/web_macpedia_2012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/announcements/web_macpedia_2012.png
--------------------------------------------------------------------------------
/Admin/announcements/web_modelling_blog_2012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/announcements/web_modelling_blog_2012.png
--------------------------------------------------------------------------------
/Admin/bitly-releases/requirements-bitlytool.txt:
--------------------------------------------------------------------------------
1 | beautifulsoup4
2 | beautifultable
3 |
--------------------------------------------------------------------------------
/Admin/doco-uml/Documentation on PyNSource models.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/Documentation on PyNSource models.docx
--------------------------------------------------------------------------------
/Admin/doco-uml/Documentation on PyNSource models.odt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/Documentation on PyNSource models.odt
--------------------------------------------------------------------------------
/Admin/doco-uml/OGL-like UML 2015.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/OGL-like UML 2015.png
--------------------------------------------------------------------------------
/Admin/doco-uml/Overlap Unit Test Visual Doco.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/Overlap Unit Test Visual Doco.docx
--------------------------------------------------------------------------------
/Admin/doco-uml/ParsereportgenUML1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/ParsereportgenUML1.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/UML pynsource - corelayout1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/UML pynsource - corelayout1.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/UML pynsource - pynsourcegui1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/UML pynsource - pynsourcegui1.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/UML_pynsource parse01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/UML_pynsource parse01.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/UML_pynsourceGUI.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/UML_pynsourceGUI.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/UML_wxOGL.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/UML_wxOGL.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/comment nodes - UML class-sequence-combo diagram 2019.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/comment nodes - UML class-sequence-combo diagram 2019.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/epydoc_pynsource_proj1.prj:
--------------------------------------------------------------------------------
1 | (dp0
2 | S'show_imports'
3 | p1
4 | I0
5 | sS'prj_name'
6 | p2
7 | S'pynsource doco'
8 | p3
9 | sS'docformat'
10 | p4
11 | S'epytext'
12 | p5
13 | sS'inheritance'
14 | p6
15 | S'grouped'
16 | p7
17 | sS'help'
18 | p8
19 | NsS'modules'
20 | p9
21 | (VF:/Documents/AndyTabletXp2/Documents and Settings/Andy/My Documents/Software Development/aa python/pyNsource/pynsource/core_parser.py
22 | p10
23 | VF:/Documents/AndyTabletXp2/Documents and Settings/Andy/My Documents/Software Development/aa python/pyNsource/pynsource/gen_asciiart.py
24 | p11
25 | VF:/Documents/AndyTabletXp2/Documents and Settings/Andy/My Documents/Software Development/aa python/pyNsource/pynsource/gen_base.py
26 | p12
27 | VF:/Documents/AndyTabletXp2/Documents and Settings/Andy/My Documents/Software Development/aa python/pyNsource/pynsource/gen_delphi.py
28 | p13
29 | tp14
30 | sS'private'
31 | p15
32 | I1
33 | sS'prj_url'
34 | p16
35 | NsS'introspect_or_parse'
36 | p17
37 | S'both'
38 | p18
39 | sS'frames'
40 | p19
41 | I1
42 | sS'css'
43 | p20
44 | S'default'
45 | p21
46 | sS'target'
47 | p22
48 | S'C:/Users/Andy/Desktop/try'
49 | p23
50 | s.
--------------------------------------------------------------------------------
/Admin/doco-uml/gen_epydoc.bat:
--------------------------------------------------------------------------------
1 | python C:\Python26\Lib\site-packages\epydoc\cli.py -o c:\users\andy\desktop\try --graph umlclasstree --dotpath "\program files\graphviz2.26.3\bin\dot.exe" "F:\Documents\AndyTabletXp2\Documents and Settings\Andy\My Documents\Software Development\aa python\pyNsource\pynsource\*.py"
2 |
--------------------------------------------------------------------------------
/Admin/doco-uml/gui_uml_01_sha_884410.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/gui_uml_01_sha_884410.png
--------------------------------------------------------------------------------
/Admin/doco-uml/gui_uml_latest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/gui_uml_latest.png
--------------------------------------------------------------------------------
/Admin/doco-uml/parse_model_uml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/parse_model_uml.png
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsource 1 - overview uml july 2012.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsource 1 - overview uml july 2012.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsource 1.eap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsource 1.eap
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsource classentry dict 1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsource classentry dict 1.png
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsource devel notes scans.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsource devel notes scans.pdf
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsourceUML-2015.mic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsourceUML-2015.mic
--------------------------------------------------------------------------------
/Admin/doco-uml/pynsourceUML-2015.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/doco-uml/pynsourceUML-2015.pdf
--------------------------------------------------------------------------------
/Admin/site-andypatterns/yUml vs Ogl render 1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/site-andypatterns/yUml vs Ogl render 1.png
--------------------------------------------------------------------------------
/Admin/site-atug/pynsource-latest-devel.txt:
--------------------------------------------------------------------------------
1 | {
2 | "latest_version" : 1.84,
3 | "latest_announcement" : """
4 | - fixed: more robust handling of type annotations on function and method arguments e.g. def foo(a: Optional[str])
5 |
6 | Recent changes:
7 | - fixed: PlantUML diagram rendering due to PlantUML server changes (again)
8 | - fixed: UML Ascii Art formatting on Mac
9 | - Matrix Multiplication operator @ now parsed correctly (fixes issue 102)
10 | - Handle any type of nested string parameter annotation e.g. "A" or "A.B" or "A.B.C" etc. (fixes issue 103)
11 | - Fix missing app icon on Mac and Ubuntu builds
12 | - Ability to Export diagram to XML
13 |
14 | """,
15 | "version_syntax_format" : 1,
16 | "download_url" : "http://bit.ly/pynsource-upgrade-download"
17 | }
18 |
19 | # Versions 1.51 and higher check for this announcement file.
20 | # Commit this file to Github, Pynsource now checks GitHub repo directly
21 | # No longer checks http://www.atug.com/downloads/pynsource-latest.txt
--------------------------------------------------------------------------------
/Admin/site-atug/pynsource-latest.txt:
--------------------------------------------------------------------------------
1 | {
2 | "latest_version" : 1.84,
3 | "latest_announcement" : """
4 | - fixed: more robust handling of type annotations on function and method arguments e.g. def foo(a: Optional[str])
5 |
6 | Recent changes:
7 | - fixed: PlantUML diagram rendering due to PlantUML server changes (again)
8 | - fixed: UML Ascii Art formatting on Mac
9 | - Matrix Multiplication operator @ now parsed correctly (fixes issue 102)
10 | - Handle any type of nested string parameter annotation e.g. "A" or "A.B" or "A.B.C" etc. (fixes issue 103)
11 | - Fix missing app icon on Mac and Ubuntu builds
12 | - Ability to Export diagram to XML
13 |
14 | """,
15 | "version_syntax_format" : 1,
16 | "download_url" : "http://bit.ly/pynsource-upgrade-download"
17 | }
18 |
19 | # Versions 1.51 and higher check for this announcement file.
20 | # Commit this file to Github, Pynsource now checks GitHub repo directly
21 | # No longer checks http://www.atug.com/downloads/pynsource-latest.txt
--------------------------------------------------------------------------------
/Admin/site-sourceforge/PyNSource Home on SourceForge.net.url:
--------------------------------------------------------------------------------
1 | [InternetShortcut]
2 | URL=https://sourceforge.net/projects/pyidea/
3 |
--------------------------------------------------------------------------------
/Admin/site-sourceforge/readme moved to google.markdown:
--------------------------------------------------------------------------------
1 | *Latest* Source code and latest downloads of PyNsource have now moved to [pynsource at google code](http://code.google.com/p/pynsource/)
2 |
3 | Sourceforge now hosts an old version.
4 |
--------------------------------------------------------------------------------
/Admin/site-sourceforge/sfmigrate.bat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Admin/site-sourceforge/sfmigrate.bat
--------------------------------------------------------------------------------
/Admin/site-sourceforge/sourceforge info misc.txt:
--------------------------------------------------------------------------------
1 | Check out from
2 | https://pyidea.svn.sourceforge.net/svnroot/pyidea/pynsource/trunk/
3 | (remember the https or you won't be able to move/rename things)
4 |
5 | http://pyidea.sourceforge.net/
6 |
7 | was original hosting page
8 | I changed to
9 |
10 | http://www.andypatterns.com/index.php/products/pynsource_-_uml_tool_for_python/
11 |
12 | using the Project Admin settings page.
13 |
14 | You can change the default download to a particular file by clicking on the "i" details symbol
15 | and specifying any particular file as a default for a particular o/s.
16 | I made the windows default the gui exe 1.4c on march 2011 -
17 | rather than 1.4.zip which was not an exe but also was old version (not 1.4c).
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Admin/todo/todo.txt:
--------------------------------------------------------------------------------
1 | All issues moved to
2 | http://code.google.com/p/pynsource/issues
3 |
4 | ----
5 |
6 |
--------------------------------------------------------------------------------
/INSTALL-TIPS.md:
--------------------------------------------------------------------------------
1 | # Fedora installation tips
2 |
3 | Fedora Linux Users: can use the script `bin/install-linux-fedora-33` in conjunction with Python 3.8. There is no wxpython wheel for Python 3.9 so simply install Python 3.8 using [pyenv](https://github.com/pyenv/pyenv/wiki#suggested-build-environment) e.g.
4 |
5 | $ sudo dnf install make gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
6 | $ curl https://pyenv.run | bash
7 |
8 | Remember to update your `.bashrc` and restart your shell.
9 |
10 | Now that `pyenv` is installed, install a version of Python
11 |
12 | $ sudo dnf install python3-devel
13 | $ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.8.8
14 |
15 | Now that a specific version of Python is installed, activate it globally or just locally
16 |
17 | $ cd pynsource
18 | $ pyenv local 3.8.8
19 |
20 | Run the script that installs Pynsource and its dependencies
21 |
22 | $ bin/install-linux-fedora-33
23 |
24 | Finally, run Pynsource
25 |
26 | $ bin/run
27 |
28 | Alternatively run the prebuilt [Fedora Pynsource binary](https://github.com/abulka/pynsource/releases/download/version-1.77/pynsource-1.77-fedora-33.zip) from the terminal like this
29 |
30 | `./Pynsource`
31 |
32 | and it should start up ok, even though it is of a type `application/x-sharedlib`. Unfortunately double clicking on the executable from file manager in Fedora doesn't seem to work.
33 |
--------------------------------------------------------------------------------
/Research/async play/report_snap_env.py:
--------------------------------------------------------------------------------
1 | import sys, os
2 | try:
3 | import wx
4 | except:
5 | print("can't import wx")
6 | else:
7 | print("import wx succeeded OK")
8 |
9 | print("sys.path")
10 | print(sys.path)
11 | print()
12 |
13 | print("\n".join(sys.path))
14 | print()
15 |
16 | print("os.getcwd()")
17 | print(os.getcwd())
18 | print()
19 |
20 | print("os.listdir()")
21 | print(os.listdir())
22 | print()
23 |
24 |
--------------------------------------------------------------------------------
/Research/async play/repro_wxasync_042_bug.py:
--------------------------------------------------------------------------------
1 | # shows how coroutine calls fails because of
2 | # frame is created inside app OnInit architecture.
3 | #
4 | # update - but now works cos of fix in
5 | # git+https://github.com/sirk390/wxasync.git@a2aa71eca525169f996be46a4515674028c8e6f5
6 | #
7 | # but now is broken again as of 0.42
8 | # reported https://github.com/sirk390/wxasync/issues/12
9 | #
10 | import wx
11 | import time
12 | # from wxasync import AsyncBind, WxAsyncApp, StartCoroutine
13 | # from wxasync041 import AsyncBind, WxAsyncApp, StartCoroutine # OK
14 | from wxasync042 import AsyncBind, WxAsyncApp, StartCoroutine # FAILED - but OK now if use self.frame below
15 | import asyncio
16 | from asyncio.events import get_event_loop
17 | import wx.lib.newevent
18 |
19 | SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()
20 |
21 | class MainApp(WxAsyncApp):
22 |
23 | def OnInit(self):
24 | self.frame = wx.Frame(None, -1, "test",)
25 | self.frame.CreateStatusBar()
26 | self.frame.Show(True)
27 | StartCoroutine(self.async_callback, self.frame) # 2nd param must be self.frame not just self
28 | return True
29 |
30 | async def async_callback(self):
31 | self.frame.SetStatusText("Button clicked")
32 | await asyncio.sleep(1)
33 | self.frame.SetStatusText("Working")
34 | await asyncio.sleep(1)
35 | self.frame.SetStatusText("Completed")
36 |
37 | def main_async():
38 | application = MainApp(0)
39 | loop = get_event_loop()
40 | loop.run_until_complete(application.MainLoop())
41 |
42 | if __name__ == "__main__":
43 | main_async()
44 |
--------------------------------------------------------------------------------
/Research/async play/requirements-linux.txt:
--------------------------------------------------------------------------------
1 | configobj
2 | requests
3 | typed_ast==1.1.1
4 | astpretty
5 | termcolor
6 | beautifultable
7 | appdirs
8 | wheel
9 | py2app
10 | click
11 | pytest
12 | coverage
13 | pytest-cov
14 | black
15 | pydbg
16 | aiohttp
17 | async_lru
18 | Pillow
19 | wxasync
20 |
--------------------------------------------------------------------------------
/Research/async play/simplest_wxapp.py:
--------------------------------------------------------------------------------
1 | import wx
2 |
3 | class MainApp(wx.App):
4 | def OnInit(self):
5 | self.frame = wx.Frame(None, -1, "test",)
6 | self.frame.CreateStatusBar()
7 | self.frame.Show(True)
8 | return True
9 |
10 | def main():
11 | application = MainApp(0)
12 | application.MainLoop()
13 |
14 | if __name__ == "__main__":
15 | main()
16 |
--------------------------------------------------------------------------------
/Research/async play/wxasync1.py:
--------------------------------------------------------------------------------
1 | import wx
2 | from wxasync import AsyncBind, WxAsyncApp, StartCoroutine
3 | import asyncio
4 | from asyncio.events import get_event_loop
5 | import time
6 |
7 | class TestFrame(wx.Frame):
8 | def __init__(self, parent=None):
9 | super(TestFrame, self).__init__(parent)
10 | vbox = wx.BoxSizer(wx.VERTICAL)
11 | button1 = wx.Button(self, label="Submit")
12 | self.edit = wx.StaticText(self, style=wx.ALIGN_CENTRE_HORIZONTAL|wx.ST_NO_AUTORESIZE)
13 | self.edit_timer = wx.StaticText(self, style=wx.ALIGN_CENTRE_HORIZONTAL|wx.ST_NO_AUTORESIZE)
14 | vbox.Add(button1, 2, wx.EXPAND|wx.ALL)
15 | vbox.AddStretchSpacer(1)
16 | vbox.Add(self.edit, 1, wx.EXPAND|wx.ALL)
17 | vbox.Add(self.edit_timer, 1, wx.EXPAND|wx.ALL)
18 | self.SetSizer(vbox)
19 | self.Layout()
20 | AsyncBind(wx.EVT_BUTTON, self.async_callback, button1)
21 | StartCoroutine(self.update_clock, self)
22 |
23 | async def async_callback(self, event):
24 | self.edit.SetLabel("Button clicked")
25 | await asyncio.sleep(1)
26 | self.edit.SetLabel("Working")
27 | await asyncio.sleep(1)
28 | self.edit.SetLabel("Completed")
29 |
30 | async def update_clock(self):
31 | while True:
32 | self.edit_timer.SetLabel(time.strftime('%H:%M:%S'))
33 | await asyncio.sleep(0.5)
34 |
35 | app = WxAsyncApp()
36 | frame = TestFrame()
37 | frame.Show()
38 | app.SetTopWindow(frame)
39 | loop = get_event_loop()
40 | loop.run_until_complete(app.MainLoop())
41 |
42 |
--------------------------------------------------------------------------------
/Research/config techniques/pynsource.ini:
--------------------------------------------------------------------------------
1 | keyword1 = 100
2 | keyword2 = hi there
3 |
--------------------------------------------------------------------------------
/Research/config techniques/testConfigObj.py:
--------------------------------------------------------------------------------
1 | # import wx
2 | import os
3 |
4 | PYNSOURCE_CONFIG_FILE = "pynsource.ini"
5 | PYNSOURCE_CONFIG_DIR = "PyNSource"
6 |
7 |
8 | def InitConfig():
9 | # config_dir = os.path.join(wx.StandardPaths.Get().GetUserConfigDir(), PYNSOURCE_CONFIG_DIR)
10 | config_dir = "."
11 | try:
12 | os.makedirs(config_dir)
13 | except OSError:
14 | pass
15 | user_config_file = os.path.join(config_dir, PYNSOURCE_CONFIG_FILE)
16 | print("Pynsource config file", user_config_file)
17 |
18 | # shelf = shelve.open(user_config_file)
19 | # shelf["users"] = ["David", "Abraham"]
20 | # shelf.sync() # Save
21 |
22 | from configobj import ConfigObj # easy_install configobj
23 |
24 | config = ConfigObj(
25 | user_config_file
26 | ) # doco at http://www.voidspace.org.uk/python/configobj.html
27 | print(config)
28 | config["keyword1"] = 100
29 | config["keyword2"] = "hi there"
30 | value1 = config["keyword1"]
31 | value2 = config["keyword2"]
32 | # config['section1']['keyword3'] = "hi there"
33 | print(config)
34 | config.write()
35 |
36 |
37 | print("hi")
38 | InitConfig()
39 |
--------------------------------------------------------------------------------
/Research/hexmvc/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.pythonPath": "/Users/Andy/.pyenv/shims/python"
3 | }
--------------------------------------------------------------------------------
/Research/hexmvc/architecture3/AppMainConfigDotnet/AppMainConfigDotnet.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual Studio 2010
4 | # SharpDevelop 4.2.0.8649-Beta 2
5 | Project("{FD48973F-F585-4F70-812B-4D0503B36CE9}") = "AppMainConfigDotnetWinForm", "AppMainConfigDotnetWinForm.pyproj", "{EA8D3EA0-9D40-4607-B7EE-D1DE72BEC9EE}"
6 | EndProject
7 | Global
8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
9 | Debug|x86 = Debug|x86
10 | Release|x86 = Release|x86
11 | EndGlobalSection
12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
13 | {EA8D3EA0-9D40-4607-B7EE-D1DE72BEC9EE}.Debug|x86.Build.0 = Debug|x86
14 | {EA8D3EA0-9D40-4607-B7EE-D1DE72BEC9EE}.Debug|x86.ActiveCfg = Debug|x86
15 | {EA8D3EA0-9D40-4607-B7EE-D1DE72BEC9EE}.Release|x86.Build.0 = Release|x86
16 | {EA8D3EA0-9D40-4607-B7EE-D1DE72BEC9EE}.Release|x86.ActiveCfg = Release|x86
17 | EndGlobalSection
18 | EndGlobal
19 |
--------------------------------------------------------------------------------
/Research/hexmvc/architecture3/AppMainConfigDotnet/UtilJsonDotnetAdapter.py:
--------------------------------------------------------------------------------
1 | # from System.Runtime.Serialization.Json import DataContractJsonSerializer
2 | #
3 | # Whats the proper way to use this class ?
4 |
5 | # Andy hack
6 | def JsonFromDictFunction(o):
7 | print("dotnet json.dumps")
8 | s = str(o)
9 | return s.replace("'", '"') # json require double quotes, not single
10 |
--------------------------------------------------------------------------------
/Research/hexmvc/architecture3/AppMainConfigDotnet/UtilRandomDotnetAdapter.py:
--------------------------------------------------------------------------------
1 | import System.Random
2 |
3 |
4 | def RandomIntFunction(n, m):
5 | print("dot net random")
6 | return System.Random().Next(m)
7 |
--------------------------------------------------------------------------------
/Research/hexmvc/architecture3/AppMainConfigDotnet/app.config:
--------------------------------------------------------------------------------
1 |
2 |
This is a test.
4 | %else: 5 |How are you?
-------------------------------------------------------------------------------- /Research/hexmvc/orm copycat test/copycat1.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | 4 | class WikiPage: 5 | def __init__(self, id, content): 6 | self.id = id 7 | self.content = content 8 | self.history = [] 9 | self.last_modify = datetime.datetime.now() 10 | 11 | 12 | class Wiki: 13 | def __init__(self): 14 | self.pages = {} 15 | 16 | def create_page(self, page_id, content): 17 | page = None 18 | if page_id in self.pages: 19 | page = self.pages[page_id] 20 | if not page: 21 | page = WikiPage(page_id, content) 22 | self.pages[page_id] = page 23 | return page 24 | 25 | 26 | from copycat import init_system 27 | 28 | wiki = init_system(Wiki(), "./files") 29 | # wiki.create_page('My First Page', 'My First Page Content') 30 | page = wiki.pages["My First Page"] 31 | print(page) 32 | -------------------------------------------------------------------------------- /Research/hexmvc/orm copycat test/files/snapshot_000000000000002.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/hexmvc/orm copycat test/files/snapshot_000000000000002.dat -------------------------------------------------------------------------------- /Research/hexmvc/orm copycat test/files/transaction_000000000000003.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/hexmvc/orm copycat test/files/transaction_000000000000003.log -------------------------------------------------------------------------------- /Research/hexmvc/orm sqlobject test/Download SQLObject.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://sqlobject.org/download.html 3 | -------------------------------------------------------------------------------- /Research/hexmvc/orm sqlobject test/andyormtest1.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/hexmvc/orm sqlobject test/andyormtest1.db -------------------------------------------------------------------------------- /Research/joint/joint2019/umlcd.css: -------------------------------------------------------------------------------- 1 | .joint-type-uml-composition .marker-target { 2 | fill: #4a4e69; 3 | stroke: #4a4e69; 4 | } 5 | -------------------------------------------------------------------------------- /Research/joint/old_0.4/joint_andy1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |This site ANDY is a prototype API for distant reading of science fiction novels.
" 10 | 11 | app.run() 12 | -------------------------------------------------------------------------------- /Research/overlap_removal_server/misc/payload1.js: -------------------------------------------------------------------------------- 1 | /* 2 | how to represent 3 | a = GraphNode("A", 0, 0, 250, 250) 4 | a1 = GraphNode("A1", 0, 0) 5 | a2 = GraphNode("A2", 0, 0) 6 | g.AddEdge(a, a1) 7 | g.AddEdge(a, a2) 8 | as a data structure - well let's convert it to JSON 9 | */ 10 | 11 | let default_width = 60 12 | let default_height = 60 13 | let payload = { 14 | nodes: [ 15 | { id: "a", label: "A", left: 0, top: 0, width: 250, height: 250 }, 16 | { id: "a1", label: "A1", left: 0, top: 0 }, 17 | { id: "a2", label: "A2", left: 0, top: 0 } 18 | ], 19 | edges: [ 20 | { from: "a", to: "a1" }, 21 | { from: "a", to: "a2" }, 22 | ] 23 | } 24 | 25 | console.log(JSON.stringify(payload)) 26 | 27 | /* 28 | {"nodes":[{"id":"a","label":"A","left":0,"top":0,"width":250,"height":250},{"id":"a1","label":"A1","left":0,"top":0},{"id":"a2","label":"A2","left":0,"top":0}],"edges":[{"from":"a","to":"a1"},{"from":"a","to":"a2"}]} 29 | */ 30 | -------------------------------------------------------------------------------- /Research/overlap_removal_server/screenshots/example_client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/overlap_removal_server/screenshots/example_client.png -------------------------------------------------------------------------------- /Research/overlap_removal_server/screenshots/geogebra_debugging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/overlap_removal_server/screenshots/geogebra_debugging.png -------------------------------------------------------------------------------- /Research/parsing/ast_and_typed_ast/astbug_python3_8_regular_ast_ok.py: -------------------------------------------------------------------------------- 1 | import ast 2 | 3 | # Proof regular ast works ok in python 3.8 4 | 5 | source = """ 6 | variable = 'a' 7 | x = 29 8 | print(f'{variable=} and {x=}') 9 | """ 10 | node = ast.parse(source) 11 | print(node) 12 | -------------------------------------------------------------------------------- /Research/parsing/ast_and_typed_ast/astbug_python3_8_typed_ast_fails.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | """ 4 | Proof that typed_ast.ast3 cannot handle Python 3.8 syntax. 5 | This models what Pynsource src/parsing/core_parser_ast.py does 6 | 7 | This is as is expected. 8 | 9 | NOTE: The official word on this is: https://github.com/python/typed_ast 10 | typed_ast will not be updated to support parsing Python 3.8 and newer. 11 | Instead, it is recommended to use the stdlib ast module there, which 12 | has been augmented to support extracting type comments and has limited 13 | support for parsing older versions of Python 3. 14 | """ 15 | 16 | # lookup tables e.g. BOOLOP_SYMBOLS in a more general way e.g. 'And' 17 | import ast as ast_native # native ast of the Python that is running 18 | 19 | if sys.version_info >= (3, 0): 20 | import typed_ast.ast27 # py2 (requires Python 3 to be running) 21 | import typed_ast.ast3 # py3 (requires Python 3 to be running) 22 | 23 | source = """ 24 | variable = 'a' 25 | x = 29 26 | print(f'{variable=} and {x=}') 27 | """ 28 | ast = typed_ast.ast3 29 | node = ast.parse(source) 30 | print(node) 31 | -------------------------------------------------------------------------------- /Research/parsing/ast_and_typed_ast/astbug_python3_8_typed_ast_fails_simple.py: -------------------------------------------------------------------------------- 1 | # import ast 2 | from typed_ast import ast3 3 | 4 | """ 5 | Proof that typed_ast.ast3 cannot handle Python 3.8 syntax. 6 | Simplified test case. 7 | 8 | This is as is expected. 9 | 10 | NOTE: The official word on this is: https://github.com/python/typed_ast 11 | typed_ast will not be updated to support parsing Python 3.8 and newer. 12 | Instead, it is recommended to use the stdlib ast module there, which 13 | has been augmented to support extracting type comments and has limited 14 | support for parsing older versions of Python 3. 15 | """ 16 | 17 | source = """ 18 | variable = 'a' 19 | x = 29 20 | print(f'{variable=} and {x=}') 21 | """ 22 | node = ast3.parse(source) 23 | print(node) 24 | -------------------------------------------------------------------------------- /Research/parsing/issues_85_93_94_parsing/demo.py: -------------------------------------------------------------------------------- 1 | x = 10 2 | SETTINGS = 'something' 3 | module_ref = SomeOtherClass() 4 | 5 | class Customer: 6 | def __init__(self, restaurant): 7 | self.restaurant: Restaurant = restaurant 8 | self.fred: Fred 9 | self.xx: Mary = None 10 | 11 | class Employee: 12 | def __init__(self, restaurant): 13 | self.restaurant: Restaurant = restaurant 14 | 15 | class Boss(Employee): 16 | salary = 1000 17 | reputation = 'good' 18 | 19 | def test(): 20 | pass 21 | 22 | def main(): 23 | pass 24 | 25 | -------------------------------------------------------------------------------- /Research/parsing/issues_85_93_94_parsing/issue_85_type_hint.py: -------------------------------------------------------------------------------- 1 | class SimpleHttpTask(Task): 2 | url = None 3 | method = "GET" 4 | client: requests.Session = requests.Session() 5 | print('done') 6 | -------------------------------------------------------------------------------- /Research/parsing/issues_85_93_94_parsing/issue_93_subscript.py: -------------------------------------------------------------------------------- 1 | class Issue93: 2 | def method1(self): 3 | self.pages: List[SnapFileView2D] = list() 4 | print('done') 5 | 6 | -------------------------------------------------------------------------------- /Research/parsing/issues_85_93_94_parsing/issue_94_walrus.py: -------------------------------------------------------------------------------- 1 | # python 3.9 required to parse this 2 | class Issue94: 3 | def method1(self): 4 | if (pair := chairs.get(number, None)) is None: 5 | pass 6 | print('done') 7 | -------------------------------------------------------------------------------- /Research/parsing/issues_85_93_94_parsing/type_hint_example.py: -------------------------------------------------------------------------------- 1 | class Customer: 2 | def __init__(self, restaurant): 3 | self.restaurant: Restaurant = restaurant 4 | self.fred: Fred 5 | self.xx: Mary = None -------------------------------------------------------------------------------- /Research/plantuml/api_example1.txt: -------------------------------------------------------------------------------- 1 | test 2 | this is a test 3 | http://plantuml.com/plantuml/png/Aov9B2hXil98pSd9LoZFByf9iUOgBial0000 4 | 5 | -------------------------------------------------------------------------------- /Research/python advanced/decorator_dump_params1.py: -------------------------------------------------------------------------------- 1 | dodump = True # ANDY MOD 2 | 3 | 4 | def dump_args(func): 5 | "This decorator dumps out the arguments passed to a function before calling it" 6 | argnames = func.__code__.co_varnames[: func.__code__.co_argcount] 7 | fname = func.__name__ 8 | 9 | if not dodump: 10 | return func 11 | 12 | def echo_func(*args, **kwargs): 13 | print( 14 | fname, 15 | ":", 16 | ", ".join( 17 | "%s=%r" % entry for entry in list(zip(argnames, args)) + list(kwargs.items()) 18 | ), 19 | ) 20 | return func(*args, **kwargs) 21 | 22 | return echo_func 23 | 24 | 25 | @dump_args 26 | def f1(a, b, c): 27 | print(a + b + c) 28 | 29 | 30 | f1(1, 2, 3) 31 | -------------------------------------------------------------------------------- /Research/python advanced/decorator_function_call_counter1.py: -------------------------------------------------------------------------------- 1 | # from http://wiki.python.org/moin/PythonDecoratorLibrary 2 | 3 | 4 | class countcalls(object): 5 | "Decorator that keeps track of the number of times a function is called." 6 | 7 | __instances = {} 8 | 9 | def __init__(self, f): 10 | self.__f = f 11 | self.__numcalls = 0 12 | countcalls.__instances[f] = self 13 | 14 | def __call__(self, *args, **kwargs): 15 | self.__numcalls += 1 16 | return self.__f(*args, **kwargs) 17 | 18 | @staticmethod 19 | def count(f): 20 | "Return the number of times the function f was called." 21 | return countcalls.__instances[f].__numcalls 22 | 23 | @staticmethod 24 | def counts(): 25 | "Return a dict of {function: # of calls} for all registered functions." 26 | return dict([(f, countcalls.count(f)) for f in countcalls.__instances]) 27 | 28 | 29 | # ANDY EXAMPLE 30 | 31 | if __name__ == "__main__": 32 | 33 | @countcalls 34 | def andy1(): 35 | print("andy1 called") 36 | 37 | andy1() 38 | andy1() 39 | andy1() 40 | 41 | # same 42 | print(countcalls.counts()) 43 | print(andy1.counts()) 44 | 45 | # print countcalls.count(andy1) # this doesn't work - why? 46 | print(countcalls.counts()) 47 | print("done") 48 | -------------------------------------------------------------------------------- /Research/python advanced/decorator_function_call_counter2.py: -------------------------------------------------------------------------------- 1 | # from http://wiki.python.org/moin/PythonDecoratorLibrary 2 | 3 | # ANDY NOTE: Nice dict formatting 4 | 5 | 6 | class countcalls(object): 7 | "Decorator that keeps track of the number of times a function is called." 8 | 9 | __instances = {} 10 | 11 | def __init__(self, f): 12 | self.__f = f 13 | self.__numcalls = 0 14 | countcalls.__instances[f] = self 15 | 16 | def __call__(self, *args, **kwargs): 17 | self.__numcalls += 1 18 | return self.__f(*args, **kwargs) 19 | 20 | def count(self): 21 | "Return the number of times the function f was called." 22 | return countcalls.__instances[self.__f].__numcalls 23 | # return self.__numcalls # ANDY - THIS WORKS TOO!? SO WHY IS THE ABOVE COMPLICATED THING USED? 24 | 25 | @staticmethod 26 | def counts(): 27 | "Return a dict of {function: # of calls} for all registered functions." 28 | return dict( 29 | [(f.__name__, countcalls.__instances[f].__numcalls) for f in countcalls.__instances] 30 | ) 31 | 32 | 33 | if __name__ == "__main__": 34 | 35 | # example 36 | 37 | @countcalls 38 | def f(): 39 | print("f called") 40 | 41 | @countcalls 42 | def g(): 43 | print("g called") 44 | 45 | f() 46 | f() 47 | f() 48 | print(f.count()) # prints 3 49 | 50 | print(countcalls.counts()) # same as f.counts() or g.counts() 51 | print(f.counts()) 52 | 53 | g() 54 | print(g.count()) # prints 1 55 | 56 | print(countcalls.counts()) 57 | 58 | print("done") 59 | -------------------------------------------------------------------------------- /Research/python advanced/interfaces1.py: -------------------------------------------------------------------------------- 1 | # Interfaces 2 | # Fantastic article http://www.doughellmann.com/PyMOTW/abc/ 3 | # 4 | 5 | import abc 6 | 7 | 8 | class PluginBase(object, metaclass=abc.ABCMeta): 9 | @abc.abstractmethod 10 | def load(self, input): 11 | """Retrieve data from the input source and return an object.""" 12 | return 13 | 14 | @abc.abstractmethod 15 | def save(self, output, data): 16 | """Save the data object to the output.""" 17 | return 18 | 19 | 20 | class SubclassImplementation(PluginBase): 21 | def load(self, input): 22 | return input.read() 23 | 24 | def save(self, output, data): 25 | return output.write(data) 26 | 27 | 28 | # o = PluginBase() # Can't instantiate base class 29 | o = SubclassImplementation() 30 | print(o) 31 | 32 | 33 | class IncompleteImplementation(PluginBase): 34 | def save(self, output, data): 35 | return output.write(data) 36 | 37 | 38 | # o = IncompleteImplementation() # Can't instantiate Incomplete Implementation 39 | # print o 40 | 41 | print("done") 42 | -------------------------------------------------------------------------------- /Research/python advanced/interfaces2.py: -------------------------------------------------------------------------------- 1 | # Interfaces 2 | # Fantastic article http://www.doughellmann.com/PyMOTW/abc/ 3 | # 4 | 5 | import abc 6 | 7 | 8 | class IPersist(object, metaclass=abc.ABCMeta): 9 | @abc.abstractmethod 10 | def load(self, input): 11 | return 12 | 13 | @abc.abstractmethod 14 | def save(self, output, data): 15 | return 16 | 17 | 18 | class ISing(object, metaclass=abc.ABCMeta): 19 | @abc.abstractmethod 20 | def sing(self): 21 | return 22 | 23 | 24 | ##### 25 | 26 | 27 | class MyClass(IPersist, ISing): 28 | def load(self, input): 29 | return input.read() 30 | 31 | def save(self, output, data): 32 | return output.write(data) 33 | 34 | def sing(self): 35 | return 36 | 37 | 38 | o = MyClass() 39 | print(o) 40 | 41 | print("done") 42 | -------------------------------------------------------------------------------- /Research/python advanced/properties1.py: -------------------------------------------------------------------------------- 1 | # Properties 2 | 3 | # In python, you don't need unnecessary getter and setter. 4 | # You can get the same thing in a more beautiful way with property. 5 | # Initially, you can code 6 | 7 | 8 | class C(object): 9 | def __init__(self, x): 10 | self.x = x 11 | 12 | 13 | obj = C(5) 14 | print("x is currently", obj.x) 15 | obj.x = 6 # set 16 | print(obj.x) # get 17 | 18 | print("-----") 19 | 20 | # Later, you can change it to allow getter, setter 21 | class C(object): 22 | def __init__(self, x): 23 | self._x = x 24 | 25 | def get_x(self): 26 | return self._x 27 | 28 | def set_x(self, x): 29 | print("x is being set (old style setter)") 30 | self._x = x 31 | 32 | x = property(get_x, set_x) 33 | 34 | 35 | obj = C(5) 36 | print("x is currently", obj.x) 37 | obj.x = 6 # set 38 | print(obj.x) # get 39 | 40 | # You can use class C in almost the same way, but you 41 | # can add anything else you want to do to get_x, set_x. 42 | 43 | print("-----") 44 | 45 | # 46 | # new-style properties 47 | # 48 | 49 | 50 | class C(object): 51 | def __init__(self, x): 52 | self._x = x 53 | 54 | @property 55 | def x(self): 56 | return self._x 57 | 58 | @x.setter 59 | def x(self, value): 60 | print("x is being set (new style)") 61 | self._x = value 62 | 63 | 64 | c = C(5) 65 | print("x is currently", c.x) 66 | c.x = 6 67 | print(c.x) 68 | -------------------------------------------------------------------------------- /Research/run_research_guis.bat: -------------------------------------------------------------------------------- 1 | cd "wx form builder" 2 | python fbpyn1.py 3 | cd .. 4 | 5 | cd hexmvc\architecture3 6 | python AppMainConfigOo.py 7 | cd ..\.. 8 | 9 | cd "layout force spring" 10 | python gui.py 11 | cd .. 12 | -------------------------------------------------------------------------------- /Research/state chart editor/Editor.py: -------------------------------------------------------------------------------- 1 | # Editor.py 2 | from Statechart import Statechart 3 | from TopHandler import TopHandler 4 | from GUI import GUI 5 | 6 | 7 | class Editor: 8 | def __init__(self): 9 | self.topHandler = TopHandler() 10 | self.GUI = GUI(self.topHandler) 11 | self.topHandler.setGUI(self.GUI) 12 | self.statechart = Statechart(self.GUI.getStatechartHandler()) 13 | self.statechart.setCanvas(self.GUI.getCanvas()) 14 | self.topHandler.setStatechart(self.statechart) 15 | 16 | def start(self): 17 | self.GUI.mainloop() 18 | 19 | 20 | if __name__ == "__main__": 21 | editor = Editor() 22 | editor.start() 23 | -------------------------------------------------------------------------------- /Research/state chart editor/Globals.py: -------------------------------------------------------------------------------- 1 | # state minimum width 2 | MIN_WIDTH = 90 3 | # state minimum height 4 | MIN_HEIGHT = 50 5 | # state corner radius 6 | RADIUS = 14 7 | # final state radius 8 | FINAL_OUT_RADIUS = 17 9 | # final state inside radius (black dot) 10 | FINAL_IN_RADIUS = 10 11 | SEPARATOR_WIDTH = 5 12 | TRANSITION_WIDTH = 2 13 | TRANSITION_DOT = 3 14 | TRANSITION_LABEL_DY = 8 15 | SEPARATOR_PAD = 23 16 | SEPARATOR_BITMAP = "gray50" 17 | SELECTED_COLOR = "blue" 18 | SHADOW_COLOR = "gray" 19 | 20 | 21 | NO_HS = 0 22 | ONE_HS = 1 23 | DEEP_HS = 2 24 | -------------------------------------------------------------------------------- /Research/state chart editor/icon16win.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/state chart editor/icon16win.ico -------------------------------------------------------------------------------- /Research/state chart editor/junk.log: -------------------------------------------------------------------------------- 1 | MsSansSerif not found, using Courier. 2 | -------------------------------------------------------------------------------- /Research/state chart editor/junk.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/state chart editor/junk.pdf -------------------------------------------------------------------------------- /Research/winerack ogl and floatcanvas/Moo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/winerack ogl and floatcanvas/Moo.jpg -------------------------------------------------------------------------------- /Research/wx doco/Custom CommandEvent in wxPython.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://stackoverflow.com/questions/640045/generate-a-custom-commandevent-in-wxpython 3 | -------------------------------------------------------------------------------- /Research/wx doco/ImageViewer0.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # myscrolledwindow.py 4 | 5 | import wx 6 | 7 | 8 | class MyScrolledWindow(wx.Frame): 9 | def __init__(self, parent, id, title): 10 | wx.Frame.__init__(self, parent, id, title, size=(500, 400)) 11 | 12 | sw = wx.ScrolledWindow(self) 13 | bmp = wx.Image("moo.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap() 14 | wx.StaticBitmap(sw, -1, bmp) 15 | sw.SetScrollbars(20, 20, 55, 40) 16 | 17 | 18 | class MyApp(wx.App): 19 | def OnInit(self): 20 | frame = MyScrolledWindow(None, -1, "Aliens") 21 | frame.Show(True) 22 | frame.Centre() 23 | return True 24 | 25 | 26 | app = MyApp(0) 27 | app.MainLoop() 28 | -------------------------------------------------------------------------------- /Research/wx doco/ImageViewer0a.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import wx, os 4 | 5 | 6 | class TestFrame(wx.Frame): 7 | def __init__(self, *args, **kwargs): 8 | 9 | wx.Frame.__init__(self, *args, **kwargs) 10 | 11 | sw = wx.ScrolledWindow(self) 12 | 13 | bmp = wx.Image("moo.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap() 14 | wx.StaticBitmap(sw, -1, bmp) 15 | sw.SetScrollbars(20, 20, 55, 40) 16 | 17 | 18 | class App(wx.App): 19 | def OnInit(self): 20 | frame = TestFrame(None, title="Andy wxBitmap Test") 21 | frame.Show(True) 22 | frame.Centre() 23 | return True 24 | 25 | 26 | if __name__ == "__main__": 27 | app = App(0) 28 | app.MainLoop() 29 | 30 | """ 31 | You'll be better off not using a wx.StaticBitmap for this. (After all 32 | static means unchanging.) Instead catch the EVT_PAINT event and draw 33 | the bitmap yourself. Then you can do things like stretching it to fit 34 | the window, or whatever you want. Just convert it to a wx.Image, 35 | manipulate it, convert to a wx.Bitmap and draw it. 36 | """ 37 | -------------------------------------------------------------------------------- /Research/wx doco/ImageViewer4.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import wx 4 | 5 | 6 | class TestApp(wx.App): 7 | def OnInit(self): 8 | self.MainFrame = wx.Frame(None, -1, "Test Frame") 9 | self.MainFrame.SetBackgroundColour(wx.WHITE) 10 | self.BMP = wx.Bitmap("../../outyuml.png", wx.BITMAP_TYPE_PNG) 11 | self.MainFrame.Bind(wx.EVT_PAINT, self.OnPaint) 12 | self.MainFrame.Show() 13 | return True 14 | 15 | def OnPaint(self, Event): 16 | DC = wx.PaintDC(self.MainFrame) 17 | DC.DrawBitmap(self.BMP, 0, 0) 18 | Event.Skip() 19 | 20 | 21 | App = TestApp(1) 22 | App.MainLoop() 23 | -------------------------------------------------------------------------------- /Research/wx doco/ImageViewer4scaled.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import wx 4 | 5 | 6 | class TestApp(wx.App): 7 | def OnInit(self): 8 | self.MainFrame = wx.Frame(None, -1, "Test Frame") 9 | self.MainFrame.SetBackgroundColour(wx.WHITE) 10 | 11 | self.sw = wx.ScrolledWindow(self.MainFrame) 12 | self.sw.SetScrollbars(20, 20, 55, 40) 13 | 14 | self.BMP = wx.Bitmap("../../outyuml.png", wx.BITMAP_TYPE_PNG) 15 | 16 | self.sw.Bind(wx.EVT_PAINT, self.OnPaint) 17 | 18 | # self.MainFrame.Bind(wx.EVT_PAINT, self.OnPaint) 19 | self.MainFrame.Show() 20 | return True 21 | 22 | def OnPaint(self, Event): 23 | DC = wx.PaintDC(self.sw, self.BMP, wx.BUFFER_VIRTUAL_AREA) 24 | # DC = wx.PaintDC(self.sw) 25 | DC.SetUserScale(2, 2) # ANDY 26 | DC.DrawBitmap(self.BMP, 0, 0) 27 | Event.Skip() 28 | 29 | 30 | App = TestApp(1) 31 | App.MainLoop() 32 | -------------------------------------------------------------------------------- /Research/wx doco/Images/Moo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/Moo.jpg -------------------------------------------------------------------------------- /Research/wx doco/Images/Physics-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/Physics-4.jpg -------------------------------------------------------------------------------- /Research/wx doco/Images/SPLASHSCREEN.BMP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/SPLASHSCREEN.BMP -------------------------------------------------------------------------------- /Research/wx doco/Images/SliderPuzzle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/SliderPuzzle.jpg -------------------------------------------------------------------------------- /Research/wx doco/Images/fish1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/fish1.png -------------------------------------------------------------------------------- /Research/wx doco/Images/img_uml01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/img_uml01.png -------------------------------------------------------------------------------- /Research/wx doco/Images/outyuml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/outyuml.png -------------------------------------------------------------------------------- /Research/wx doco/Images/outyuml_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/outyuml_big.png -------------------------------------------------------------------------------- /Research/wx doco/Images/pickle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/pickle.jpg -------------------------------------------------------------------------------- /Research/wx doco/Images/shader-ReflectiveBumpedVertexLit-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/shader-ReflectiveBumpedVertexLit-0.jpg -------------------------------------------------------------------------------- /Research/wx doco/Images/w05_783sidebar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Images/w05_783sidebar.jpg -------------------------------------------------------------------------------- /Research/wx doco/LongRunning wx.gauge no while-loop.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://stackoverflow.com/questions/2052369/updating-the-wx-gauge-without-while-loop/2052462#2052462 3 | -------------------------------------------------------------------------------- /Research/wx doco/LongRunningTasks - wxPyWiki.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://wiki.wxpython.org/LongRunningTasks 3 | -------------------------------------------------------------------------------- /Research/wx doco/MessageBox - MessageDialog - wxPython-users - Google Groups.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://groups.google.com/group/wxPython-users/browse_thread/thread/81c7d3d590eef04a 3 | -------------------------------------------------------------------------------- /Research/wx doco/Moo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx doco/Moo.jpg -------------------------------------------------------------------------------- /Research/wx doco/Response from MessageDialog.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.java2s.com/Tutorial/Python/0380__wxPython/ResponsefromMessageDialog.htm 3 | -------------------------------------------------------------------------------- /Research/wx doco/aui library Advanced Generic Widgets v0.9.1 documentation.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://xoomer.virgilio.it/infinity77/AGW_Docs/aui_module.html#aui 3 | -------------------------------------------------------------------------------- /Research/wx doco/python - wxPython- Making a scrollable DC - Stack Overflow.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://stackoverflow.com/questions/677590/wxpython-making-a-scrollable-dc 3 | -------------------------------------------------------------------------------- /Research/wx doco/resize_scroll_01.py: -------------------------------------------------------------------------------- 1 | import wx 2 | 3 | 4 | class ScrollbarFrame(wx.Frame): 5 | def __init__(self): 6 | wx.Frame.__init__(self, None, -1, "Scrollbar Example", size=(300, 200)) 7 | self.scroll = wx.ScrolledWindow(self, -1) 8 | self.scroll.SetScrollbars(1, 1, 600, 400) 9 | self.button = wx.Button(self.scroll, -1, "Scroll Me", pos=(50, 20)) 10 | self.Bind(wx.EVT_BUTTON, self.OnClickTop, self.button) 11 | self.button2 = wx.Button(self.scroll, -1, "Scroll Back", pos=(500, 350)) 12 | self.Bind(wx.EVT_BUTTON, self.OnClickBottom, self.button2) 13 | 14 | self.button = wx.Button(self.scroll, -1, "Extend scroll area1", pos=(50, 120)) 15 | self.Bind(wx.EVT_BUTTON, self.OnClickExtend1, self.button) 16 | self.button = wx.Button(self.scroll, -1, "Shrink scroll area1", pos=(150, 120)) 17 | self.Bind(wx.EVT_BUTTON, self.OnClickShrink1, self.button) 18 | 19 | def OnClickTop(self, event): 20 | self.scroll.Scroll(600, 400) 21 | 22 | def OnClickBottom(self, event): 23 | self.scroll.Scroll(1, 1) 24 | 25 | def OnClickExtend1(self, event): 26 | self.scroll.SetScrollbars(1, 1, 1600, 1400) 27 | 28 | def OnClickShrink1(self, event): 29 | self.scroll.SetScrollbars(1, 1, 600, 400) 30 | 31 | 32 | app = wx.PySimpleApp() 33 | frame = ScrollbarFrame() 34 | frame.Show() 35 | app.MainLoop() 36 | -------------------------------------------------------------------------------- /Research/wx doco/scroll_window_in_action1.py: -------------------------------------------------------------------------------- 1 | import wx 2 | 3 | 4 | class ScrollbarFrame(wx.Frame): 5 | def __init__(self): 6 | wx.Frame.__init__(self, None, -1, "Scrollbar Example", size=(300, 200)) 7 | self.scroll = wx.ScrolledWindow(self, -1) 8 | print("GetVirtualSize()", self.GetVirtualSize()) 9 | self.scroll.SetScrollbars(1, 1, 600, 400) 10 | print("GetVirtualSize()", self.GetVirtualSize()) 11 | self.button = wx.Button(self.scroll, -1, "Scroll Me", pos=(50, 20)) 12 | self.Bind(wx.EVT_BUTTON, self.OnClickTop, self.button) 13 | self.button2 = wx.Button(self.scroll, -1, "Scroll Back", pos=(500, 350)) 14 | self.Bind(wx.EVT_BUTTON, self.OnClickBottom, self.button2) 15 | 16 | def OnClickTop(self, event): 17 | self.scroll.Scroll(600, 400) 18 | print("FRAME") 19 | print("GetVirtualSize()", self.GetVirtualSize()) 20 | print("GetSize()", self.GetSize()) 21 | print("ScrolledWindow ------ ") 22 | print("GetVirtualSize()", self.scroll.GetVirtualSize()) 23 | print("GetSize()", self.scroll.GetSize()) 24 | print("**********") 25 | 26 | def OnClickBottom(self, event): 27 | self.scroll.Scroll(1, 1) 28 | 29 | 30 | if __name__ == "__main__": 31 | app = wx.PySimpleApp() 32 | frame = ScrollbarFrame() 33 | frame.Show() 34 | app.MainLoop() 35 | -------------------------------------------------------------------------------- /Research/wx doco/somenotebook0.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # notebook.py 4 | 5 | import wx 6 | import wx.lib.sheet as sheet 7 | 8 | 9 | class MySheet(sheet.CSheet): 10 | def __init__(self, parent): 11 | sheet.CSheet.__init__(self, parent) 12 | self.SetNumberRows(50) 13 | self.SetNumberCols(50) 14 | 15 | 16 | class Notebook(wx.Frame): 17 | def __init__(self, parent, id, title): 18 | wx.Frame.__init__(self, parent, id, title, size=(600, 500)) 19 | menubar = wx.MenuBar() 20 | file = wx.Menu() 21 | file.Append(101, "Quit", "") 22 | menubar.Append(file, "&File") 23 | self.SetMenuBar(menubar) 24 | 25 | wx.EVT_MENU(self, 101, self.OnQuit) 26 | 27 | nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM) 28 | self.sheet1 = MySheet(nb) 29 | self.sheet2 = MySheet(nb) 30 | self.sheet3 = MySheet(nb) 31 | 32 | nb.AddPage(self.sheet1, "Sheet1") 33 | nb.AddPage(self.sheet2, "Sheet2") 34 | nb.AddPage(self.sheet3, "Sheet3") 35 | 36 | self.sheet1.SetFocus() 37 | self.StatusBar() 38 | self.Centre() 39 | self.Show() 40 | 41 | def StatusBar(self): 42 | self.statusbar = self.CreateStatusBar() 43 | 44 | def OnQuit(self, event): 45 | self.Close() 46 | 47 | 48 | app = wx.App() 49 | Notebook(None, -1, "notebook.py") 50 | app.MainLoop() 51 | -------------------------------------------------------------------------------- /Research/wx doco/somesimple1.py: -------------------------------------------------------------------------------- 1 | # simple 2 | 3 | import wx 4 | 5 | 6 | class Line(wx.Frame): 7 | def __init__(self, parent, id, title): 8 | wx.Frame.__init__(self, parent, id, title, size=(250, 150)) 9 | 10 | wx.FutureCall(1000, self.DrawLine) 11 | 12 | self.Centre() 13 | self.Show(True) 14 | 15 | def DrawLine(self): 16 | dc = wx.ClientDC(self) 17 | dc.DrawLine(50, 60, 190, 60) 18 | 19 | # dc.DrawArc(50, 50, 50, 10, 20, 20) 20 | # dc.DrawEllipticArc(10,10, 50, 20, 0, 180) 21 | 22 | points = [wx.Point(10, 10), wx.Point(15, 55), wx.Point(40, 30)] 23 | dc.DrawSpline(points) 24 | 25 | 26 | app = wx.App() 27 | Line(None, -1, "Line") 28 | app.MainLoop() 29 | -------------------------------------------------------------------------------- /Research/wx doco/wx Index.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/indices.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wx.MessageDialog.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/wx.MessageDialog-class.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wx.ScrolledWindow.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/wx.ScrolledWindow-class.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wx.Window.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/wx.Window-class.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wx.lib.ogl.Diagram.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/wx.lib.ogl.Diagram-class.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wx.lib.ogl.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.wxpython.org/docs/api/wx.lib.ogl-module.html 3 | -------------------------------------------------------------------------------- /Research/wx doco/wxOGL - wxPyWiki - MAIN EXAMPLES.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://wiki.wxpython.org/wxOGL 3 | -------------------------------------------------------------------------------- /Research/wx doco/wxPython dialogs.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://zetcode.com/wxpython/dialogs/ 3 | -------------------------------------------------------------------------------- /Research/wx doco/wxpython Overview Of GDI.url: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.itrascal.com/paila/GDI/OverviewOfGDI/tabid/106/Default.aspx 3 | -------------------------------------------------------------------------------- /Research/wx form builder/2019test1/run.sh: -------------------------------------------------------------------------------- 1 | pythonw test1.py 2 | -------------------------------------------------------------------------------- /Research/wx form builder/2019test1/toucan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/2019test1/toucan.png -------------------------------------------------------------------------------- /Research/wx form builder/Doco Custom Component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/Doco Custom Component.png -------------------------------------------------------------------------------- /Research/wx form builder/Doco ogl Custom Component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/Doco ogl Custom Component.png -------------------------------------------------------------------------------- /Research/wx form builder/fbogl1.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from fbogl1_gen import MyFrame2 3 | import wx.lib.ogl as ogl 4 | 5 | app = wx.App() 6 | ogl.OGLInitialize() 7 | frame = MyFrame2(None) 8 | frame.Show() 9 | frame.SetSize((400, 400)) 10 | 11 | frame.canvas.SetBackgroundColour("LIGHT BLUE") 12 | # Optional - add a shape 13 | shape = ogl.RectangleShape(60, 60) 14 | shape.SetX(50) 15 | shape.SetY(50) 16 | frame.canvas.AddShape(shape) 17 | frame.canvas.GetDiagram().ShowAll(True) 18 | 19 | app.MainLoop() 20 | -------------------------------------------------------------------------------- /Research/wx form builder/fbogl1_gen.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ########################################################################### 4 | ## Python code generated with wxFormBuilder (version Mar 22 2011) 5 | ## http://www.wxformbuilder.org/ 6 | ## 7 | ## PLEASE DO "NOT" EDIT THIS FILE! 8 | ########################################################################### 9 | 10 | import wx 11 | import wx.lib.ogl as ogl 12 | 13 | ########################################################################### 14 | ## Class MyFrame2 15 | ########################################################################### 16 | 17 | 18 | class MyFrame2(wx.Frame): 19 | def __init__(self, parent): 20 | wx.Frame.__init__( 21 | self, 22 | parent, 23 | id=wx.ID_ANY, 24 | title=wx.EmptyString, 25 | pos=wx.DefaultPosition, 26 | size=wx.Size(500, 300), 27 | style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, 28 | ) 29 | 30 | self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 31 | 32 | bSizer9 = wx.BoxSizer(wx.VERTICAL) 33 | 34 | self.canvas = ogl.ShapeCanvas(self) 35 | diagram = ogl.Diagram() 36 | self.canvas.SetDiagram(diagram) 37 | diagram.SetCanvas(self.canvas) 38 | bSizer9.Add(self.canvas, 1, wx.ALL | wx.EXPAND, 5) 39 | 40 | self.SetSizer(bSizer9) 41 | self.Layout() 42 | 43 | self.Centre(wx.BOTH) 44 | 45 | def __del__(self): 46 | pass 47 | -------------------------------------------------------------------------------- /Research/wx form builder/fbtest01.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from fbtest01_gen import * 3 | 4 | 5 | class MyFrame1A(MyFrame1): 6 | def OnButton1(self, event): 7 | print("button pushed") 8 | 9 | def OnHtml2(self, event): 10 | url = "http://www.wxpython.org/docs/api/wx.html.HtmlWindow-class.html" 11 | wx.CallAfter(frame.m_htmlWin1.LoadPage, url) 12 | 13 | def OnLoadHtml1(self, event): 14 | url = "http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm" 15 | wx.CallAfter(frame.m_htmlWin1.LoadPage, url) 16 | # frame.m_htmlWin1.LoadPage(url) 17 | 18 | 19 | app = wx.App() 20 | frame = MyFrame1A(None) 21 | frame.Show() 22 | frame.SetSize((400, 400)) 23 | 24 | 25 | app.MainLoop() 26 | -------------------------------------------------------------------------------- /Research/wx form builder/icons16/katomic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons16/katomic.png -------------------------------------------------------------------------------- /Research/wx form builder/icons16/kcmprocessor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons16/kcmprocessor.png -------------------------------------------------------------------------------- /Research/wx form builder/icons16/kcmscsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons16/kcmscsi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons16/kedit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons16/kedit.png -------------------------------------------------------------------------------- /Research/wx form builder/icons16/khangman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons16/khangman.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kaboodleloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kaboodleloop.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kalarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kalarm.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kalzium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kalzium.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kcmmidi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kcmmidi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kcmprocessor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kcmprocessor.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kcmscsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kcmscsi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kcontrol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kcontrol.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kedit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kedit.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/khangman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/khangman.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kmid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kmid.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kmoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kmoon.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kopete_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kopete_offline.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/kreversi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/kreversi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/package_development.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/package_development.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/reload.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/roll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/roll.png -------------------------------------------------------------------------------- /Research/wx form builder/icons22/tool_timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons22/tool_timer.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kalzium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kalzium.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kcmmidi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kcmmidi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kcmprocessor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kcmprocessor.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kcmscsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kcmscsi.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kcontrol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kcontrol.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kedit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kedit.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/khangman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/khangman.png -------------------------------------------------------------------------------- /Research/wx form builder/icons32/kmoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/wx form builder/icons32/kmoon.png -------------------------------------------------------------------------------- /Research/wx form builder/some_fb1.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from some_fb2_gen import MyFrame1 3 | 4 | app = wx.App() 5 | frame = MyFrame1(None) 6 | frame.Show() 7 | app.MainLoop() 8 | -------------------------------------------------------------------------------- /Research/wx form builder/some_fb2_1.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from someStyledTextCtrl2 import runTest 3 | 4 | # Good demo http://zamestnanci.fai.utb.cz/~bliznak/screencast/wxfbtut1/wxFBTut1.html 5 | 6 | 7 | from some_fb2_gen import * 8 | 9 | 10 | class MyFrame3A(MyFrame3): 11 | def OnButton1(self, event): 12 | print("button pushed") 13 | 14 | def OnHi(self, event): 15 | print("hi") 16 | 17 | def OnSay(self, event): 18 | print("say") 19 | 20 | 21 | app = wx.App() 22 | 23 | # DEMO 3 24 | # frame = MyFrame3A(None) 25 | 26 | # DEMO 2 27 | frame = MyFrame2(None) 28 | p = runTest(frame, frame, None) 29 | frame.m_scintilla1 = p 30 | # frame.m_scintilla1.SetText(demoText + open(r'..\..\pynsource\printframework.py').read()) 31 | 32 | 33 | frame.Show() 34 | app.MainLoop() 35 | -------------------------------------------------------------------------------- /Research/wx form builder/some_fb2_2.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from some_fb2_gen import MyFrame2 3 | 4 | app = wx.App() 5 | frame = MyFrame2(None) 6 | frame.m_customControl1.SetText(open(r"..\..\pynsource\printframework.py").read()) 7 | frame.m_customControl1.EmptyUndoBuffer() 8 | frame.Show() 9 | app.MainLoop() 10 | -------------------------------------------------------------------------------- /Research/wx form builder/some_fb2_2_altered.py: -------------------------------------------------------------------------------- 1 | import wx 2 | from some_fb2_gen_altered import MyFrame2 3 | 4 | app = wx.App() 5 | frame = MyFrame2(None) 6 | frame.m_scintilla1.SetText(open(r"..\..\pynsource\printframework.py").read()) 7 | frame.m_scintilla1.EmptyUndoBuffer() 8 | frame.Show() 9 | app.MainLoop() 10 | -------------------------------------------------------------------------------- /Research/wx form builder/some_fb2_3.py: -------------------------------------------------------------------------------- 1 | import wx 2 | 3 | # Good demo http://zamestnanci.fai.utb.cz/~bliznak/screencast/wxfbtut1/wxFBTut1.html 4 | 5 | 6 | from some_fb2_gen import * 7 | 8 | 9 | class MyFrame3A(MyFrame3): 10 | def OnButton1(self, event): 11 | print("button pushed") 12 | 13 | def OnHi(self, event): 14 | print("hi") 15 | 16 | def OnSay(self, event): 17 | print("say") 18 | 19 | 20 | app = wx.App() 21 | 22 | # DEMO 3 23 | frame = MyFrame3A(None) 24 | 25 | frame.Show() 26 | app.MainLoop() 27 | -------------------------------------------------------------------------------- /Research/wx form builder/splitwin01.py: -------------------------------------------------------------------------------- 1 | import wx 2 | 3 | 4 | class MyFrame(wx.Frame): 5 | def __init__(self, parent, id, title): 6 | wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350, 300)) 7 | 8 | splitter = wx.SplitterWindow(self, -1) 9 | panel1 = wx.Panel(splitter, -1) 10 | wx.StaticText( 11 | panel1, 12 | -1, 13 | "Whether you think that you can, or that you can't, you are usually right." 14 | "\n\n Henry Ford", 15 | (100, 100), 16 | style=wx.ALIGN_CENTRE, 17 | ) 18 | panel1.SetBackgroundColour(wx.LIGHT_GREY) 19 | panel2 = wx.Panel(splitter, -1) 20 | panel2.SetBackgroundColour(wx.WHITE) 21 | splitter.SplitVertically(panel1, panel2) 22 | self.Centre() 23 | 24 | 25 | class MyApp(wx.App): 26 | def OnInit(self): 27 | frame = MyFrame(None, -1, "splitterwindow.py") 28 | frame.Show(True) 29 | self.SetTopWindow(frame) 30 | return True 31 | 32 | 33 | app = MyApp(0) 34 | app.MainLoop() 35 | -------------------------------------------------------------------------------- /Research/wxglade/test2/test2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | # 4 | # generated by wxGlade 0.9.0b5 on Mon Jan 14 10:35:25 2019 5 | # 6 | 7 | import wx 8 | 9 | 10 | 11 | 12 | class _308418605_MyMenuBar(wx.MenuBar): 13 | def __init__(self, *args, **kwds): 14 | wx.MenuBar.__init__(self, *args, **kwds) 15 | wxglade_tmp_menu = wx.Menu() 16 | wxglade_tmp_menu.Append(wx.NewId(), "item", "") 17 | wxglade_tmp_menu.Append(wx.NewId(), "item", "") 18 | self.Append(wxglade_tmp_menu, "item") 19 | self.--- = wx.Menu() 20 | self.Append(self.---, "---") 21 | wxglade_tmp_menu = wx.Menu() 22 | wxglade_tmp_menu_sub = wx.Menu() 23 | wxglade_tmp_menu_sub.Append(wx.NewId(), "item", "") 24 | wxglade_tmp_menu_sub.Append(wx.NewId(), "item", "") 25 | wxglade_tmp_menu.Append(wx.NewId(), "item", wxglade_tmp_menu_sub, "") 26 | wxglade_tmp_menu.Append(wx.NewId(), "item", "") 27 | self.Append(wxglade_tmp_menu, "item") 28 | 29 | self.__set_properties() 30 | self.__do_layout() 31 | 32 | def __set_properties(self): 33 | pass 34 | 35 | def __do_layout(self): 36 | pass 37 | 38 | 39 | class MyAppy(wx.App): 40 | def OnInit(self): 41 | self.frame = MyFrame(None, wx.ID_ANY, "") 42 | self.SetTopWindow(self.frame) 43 | self.frame.Show() 44 | return True 45 | 46 | if __name__ == "__main__": 47 | appy = MyAppy(0) 48 | appy.MainLoop() 49 | -------------------------------------------------------------------------------- /Research/yuml_python/chromium launch idea.txt: -------------------------------------------------------------------------------- 1 | Actually this is nicer than wget if i dont want to save the image: 2 | 3 | chromium-browser $(cat model.yuml.txt) 4 | 5 | Updated: 6 | 7 | command-line uses regexp to replace spaces and newlines with %20, so i can break up my text file: 8 | 9 | chromium-browser $(cat model.yuml.txt | sed 's/ /%20/g' | sed ':a;N;$!ba;s/\n/%20/g') 10 | 11 | chromium-browser $(cat model.yuml.txt | sed 's/ /%20/g' | tr -d '\n') 12 | 13 | evolving: 14 | 15 | (this now just deletes all spaces and newlines) (if i want a space, i have to manually use %20) 16 | 17 | chromium-browser $(cat model.yuml.txt | tr -d ' ' | tr -d '\n') -------------------------------------------------------------------------------- /Research/yuml_python/copypng.py: -------------------------------------------------------------------------------- 1 | # http://www.codeproject.com/KB/web-image/pnggammastrip.aspx 2 | 3 | import sys 4 | import urllib.request, urllib.parse, urllib.error 5 | import urllib.request, urllib.error, urllib.parse 6 | 7 | import pnglib 8 | 9 | inputFilename = sys.argv[1] 10 | outputFilename = sys.argv[2] 11 | 12 | data = file(inputFilename, "rb") 13 | 14 | outputFile = file(outputFilename, "wb") 15 | signature = pnglib.read_signature(data) 16 | outputFile.write(signature) 17 | 18 | for chunk in png.all_chunks(data): 19 | chunk.write(outputFile) 20 | 21 | 22 | outputFile.close() 23 | -------------------------------------------------------------------------------- /Research/yuml_python/create_yuml_class_diagram.py: -------------------------------------------------------------------------------- 1 | import urllib.request, urllib.parse, urllib.error 2 | import urllib.request, urllib.error, urllib.parse 3 | 4 | import png 5 | 6 | 7 | def add_yuml_to_png(yuml, in_stream, out_stream): 8 | signature = png.read_signature(in_stream) 9 | out_stream.write(signature) 10 | 11 | for chunk in png.all_chunks(in_stream): 12 | if chunk.chunk_type == "IEND": 13 | break 14 | chunk.write(out_stream) 15 | 16 | itxt_chunk = png.iTXtChunk.create("yuml", yuml) 17 | itxt_chunk.write(out_stream) 18 | 19 | # write the IEND chunk 20 | chunk.write(out_stream) 21 | 22 | 23 | def create(yuml, output_filename): 24 | # baseUrl = 'http://yuml.me/diagram/scruffy/class/' 25 | baseUrl = "http://yuml.me/diagram/dir:lr;scruffy/class/" 26 | url = baseUrl + urllib.parse.quote(yuml) 27 | 28 | original_png = urllib.request.urlopen(url) 29 | output_file = file(output_filename, "wb") 30 | 31 | add_yuml_to_png(yuml, original_png, output_file) 32 | 33 | output_file.close() 34 | 35 | 36 | if __name__ == "__main__": 37 | import sys 38 | 39 | sys.exit(create(*sys.argv[1:3])) 40 | -------------------------------------------------------------------------------- /Research/yuml_python/example yuml1.txt: -------------------------------------------------------------------------------- 1 | # Cool UML Diagram 2 | [Customer]+1->*[Order] 3 | [Order]++1-items >*[LineItem] 4 | [Order]-0..1>[PaymentMethod] 5 | [Fred]-0..1>[MMaPS CMS] 6 | [Fred]-0..1>[MMaPS CMS2] 7 | [Fred]-0..1>[MMaPS CMS3] 8 | [MMaPS CMS3]->[thing 1] 9 | [MMaPS CMS3]->[thing 2] 10 | [MMaPS CMS3]->[thing 3] 11 | [thing 3]-[Customer|Forename;Surname;Email|Save()],[Customer]-[note: Value Object] 12 | [Customer]^[Uncool Customer] 13 | [Customer]^[Cool Customer|name;address|Do(),Do2()] -------------------------------------------------------------------------------- /Research/yuml_python/order.bat: -------------------------------------------------------------------------------- 1 | del order.png 2 | python create_yuml_class_diagram.py "[Customer]+1->*[Order], [Order]++1-items>*[LineItem], [Order]-0..1>[PaymentMethod], [Andy]>[Python]" yuml_order_example.png 3 | -------------------------------------------------------------------------------- /Research/yuml_python/outyuml2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abulka/pynsource/979436525c57fdaeaa832e960985e0406e123587/Research/yuml_python/outyuml2.png -------------------------------------------------------------------------------- /Research/yuml_python/pynsource1.bat: -------------------------------------------------------------------------------- 1 | del yuml_pynsource1_example.png 2 | python create_yuml_class_diagram.py "[HandleDefs]^[HandleClassAttributes|attrslist;waitingfordot;waitingforsubsequentdot;waitingforvarname;waitingforequalsymbol;currvarname;lastcurrvarname;waitforappendopenbracket;nextvarnameisstatic;nextvarnameismany|__init__();On_newline();_Clearwaiting();JustGotASelfAttr();On_meat();_AddAttribute()],[AndyBasicParseEngine]^[HandleClasses|currclasslist;_currclass;nexttokenisclass;classlist;modulemethods;optionModuleAsClass;inbetweenClassAndFirstDef|__init__();On_deindent();_DeriveNestedClassName();PushCurrClass();PopCurrClass();GetCurrClassIndentLevel();GetCurrClass();_JustThenGotclass();On_newline();On_meat()],[object]^[AndyBasicParseEngine|meat;tokens;isfreshline;indentlevel|__init__();_ReadAllTokensFromFile();Parse();_ParseLoop();On_deindent();On_newline();On_meat();_Gotmeat();_Isblank();_Isnewline();_Ispadding()]" yuml_pynsource1_example.png 3 | -------------------------------------------------------------------------------- /Research/yuml_python/pynsource3.bat: -------------------------------------------------------------------------------- 1 | REM do it in three stages - doesn't seem to append actually. 2 | del yuml_pynsource3_example.png 3 | python create_yuml_class_diagram.py "[HandleDefs]^[HandleClassAttributes|attrslist;waitingfordot;waitingforsubsequentdot;waitingforvarname;waitingforequalsymbol;currvarname;lastcurrvarname;waitforappendopenbracket;nextvarnameisstatic;nextvarnameismany|__init__();On_newline();_Clearwaiting();JustGotASelfAttr();On_meat();_AddAttribute()]" yuml_pynsource3_example.png 4 | python create_yuml_class_diagram.py "[AndyBasicParseEngine]^[HandleClasses|currclasslist;_currclass;nexttokenisclass;classlist;modulemethods;optionModuleAsClass;inbetweenClassAndFirstDef|__init__();On_deindent();_DeriveNestedClassName();PushCurrClass();PopCurrClass();GetCurrClassIndentLevel();GetCurrClass();_JustThenGotclass();On_newline();On_meat()]" yuml_pynsource3_example.png 5 | python create_yuml_class_diagram.py "[object]^[AndyBasicParseEngine|meat;tokens;isfreshline;indentlevel|__init__();_ReadAllTokensFromFile();Parse();_ParseLoop();On_deindent();On_newline();On_meat();_Gotmeat();_Isblank();_Isnewline();_Ispadding()]" yuml_pynsource3_example.png 6 | -------------------------------------------------------------------------------- /Research/yuml_python/read_yuml_from_png.py: -------------------------------------------------------------------------------- 1 | import png 2 | 3 | 4 | def read(pngFilename): 5 | yuml = "<