Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 65 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,114 +12,128 @@

**Description:** a friendly develop tutorial.

*这是一个ImagePy插件项目,里面覆盖了各类插件的编写方法和用法,并配有详细的文档,ImagePy的插件开发者可以以此为参考*



## 安装

ImagePy菜单:**Plugins > Manager > Plugins Manager** 在输入框内输入demo进行查询,选中Demo Plugin,点击Install,完成后菜单栏出现Demo菜单,工具栏会加入Demo工具,组件栏也会加入Demo组件。
ImagePy菜单:`Plugins > Manager > Plugins Manager` 在输入框内输入demo进行查询,选中Demo Plugin,点击`Install`,完成后菜单栏出现Demo菜单,工具栏会加入Demo工具,组件栏也会加入Demo组件。

![06](http://idoc.imagepy.org/demoplugin/06.png)
<div align=center>Install DemoPlugin</div><br>

## [基础预备](doc/start.md)

## [基础预备](doc/start.md#基础预备)
**[从这里开始](doc/start.md)**

1. [什么是插件](doc/start.md#什么是插件)

2. [Hello World](doc/start.md#Hello) (第一个插件)

3. [Who Are You](doc/start.md#Who) (带有交互)

4. [Questionnaire](doc/start.md#Questionnaire) (参数对话框详解)

2. [Hello World(第一个插件)](doc/start.md#Hello-World)
3. [Who Are You(带有交互)](doc/start.md#Who-Are-You)
4. [Questionnaire(参数对话框详解)](doc/start.md#Questionnaire)
5. [一个文件内实现多个插件](doc/start.md#一个文件内实现多个插件)



## 插件开发

**[Markdown: 文档提示](doc/markdown.md#Markdown)**
**[Markdown: 文档提示](doc/markdown.md)**

1. [Markdown Demo](doc/markdown.md#Demo)
1. [Markdown Demo](doc/markdown.md#MarkDown-Demo)

**[Macros: 用宏串联已有功能](doc/macros.md#Macros)**

1. [关于插件的加载方式](doc/macros.md#关于插件的加载方式)
2. [高斯模糊再求反](doc/macros.md#高斯模糊再求反)
3. [Coins Segment Macros:硬币分割](doc/macros.md#分割硬币)
1. [高斯模糊再求反](doc/macros.md#高斯模糊再求反)
2. [Coins Segment Macros:硬币分割](doc/macros.md#分割硬币)

**[Workflow: 可交互的宏](doc/workflow.md)**

**[Workflow: 可交互的宏](doc/workflow.md#Workflow)**
1. [Coins Segment Workflow:按照指引进行硬币分割](doc/workflow.md#硬币分割工作流)

1. [Coins Segment Workflow: 按照指引进行硬币分割](doc/workflow.md#分割硬币)
2. [工作流编写及加载方式](doc/workflow.md#工作流编写及加载方式)
**[Report: 生成报表](doc/report.md)**

**[Filter: 二维图像滤波器](doc/filter.md#Filter)**
1. [Personal Information:填写个人信息](doc/report.md#个人信息)
2. [Coins Report:硬币分割成果](doc/report.md#硬币分割)
3. [Report 插件的设计原则](doc/report.md#报表模板设计原则)

**[Filter: 二维图像滤波器](doc/filter.md)**

1. [Invert Demo:无参数的插件](doc/filter.md#Invert)
2. [Gaussian Demo:带有参数的插件](doc/filter.md#Gaussian)
3. [Filter运行机制](doc/filter.md#Filter运行机制)
3. [Filter 的运行机制](doc/filter.md#Filter-运行机制)

**[Simple: 图像整体操作](doc/simple.md#Simple)**
**[Simple: 图像整体操作](doc/simple.md)**

1. [Gaussian 3D Demo:三维滤波](doc/simple.md#Gaussian3D)
2. [Red Lut Demo:操作索引表](doc/simple.md#SetLUT)
3. [ROI Inflate Demo:操作ROI](doc/simple.md#ROI)
4. [Unit Demo: 设置比例尺及单位](doc/simple.md#Unit)
2. [Red Lut Demo:设定索引色](doc/simple.md#SetLUT)
3. [ROI Inflate Demo:操作ROI](doc/simple.md#Inflate-ROI)
4. [Unit Demo: 设置比例尺及单位](doc/simple.md#SEt-Scale-And-Unit)
5. [Draw Mark Demo: 设置Overlay Mark](doc/simple.md#Mark)
6. [Simple运行机制](doc/simple.md#Simple运行机制)
6. [Simple 的运行机制](doc/simple.md#Simple-运行机制)

**[Table: 表格数据](doc/table.md#Table)**
**[Table: 表格数据](doc/table.md)**

1. [Generate Table Demo:数据表生成](doc/table.md#生成成绩单)
2. [Sort By Key Demo:排序](doc/table.md#根据某科成绩排序)
3. [Table Plot Demo:绘图](doc/table.md#绘制柱状图)
4. [Table运行机制](doc/table.md#Table运行机制)
4. [Table 运行机制](doc/table.md#Table-运行机制)

**[Free: 没有任何依赖的插件](doc/free.md#Free)**
**[Free: 没有任何依赖的插件](doc/free.md)**

1. [New Image Demo: 新建图像](doc/free.md#创建图像)
1. [New Image Demo: 创建图像](doc/free.md#创建图像)
2. [About Demo:关于对话框](doc/free.md#关于对话框)
3. [Close Demo:退出程序](doc/free.md#退出软件)
4. [Free的运行机制](doc/free.md#Free的运行机制)
3. [Close Demo:退出软件](doc/free.md#退出软件)
4. [Free 的运行机制](doc/free.md#Free-的运行机制)

**[Tool: 鼠标交互工具](doc/tool.md#Tool)**
**[Tool: 鼠标交互工具](doc/tool.md)**

1. [Painter Demo:画笔工具](doc/tool.md#画笔工具)
2. [Tool的运行机制](doc/tool.md#Tool的运行机制)
2. [Tool的运行机制](doc/tool.md#Tool-的运行机制)

**[Widget: 桌面小部件](doc/widget.md#Widget)**
**[Widget: 桌面小部件](doc/widget.md)**

1. [Widget Demo:桌面小部件演示](doc/widget.md#画笔工具)
2. [Tool的运行机制](doc/widget.md#Tool的运行机制)
1. [Widget Demo:桌面小部件演示](doc/widget.md#桌面组件演示)
2. [Tool的运行机制](doc/widget.md#widget-的运行机制)



## [插件项目发布](doc/publish.md#插件项目发布)
## [插件项目发布](doc/publish.md)

**[插件的组织方式](doc/publish.md#功能组织)**

1. [功能划分](doc/publish.md#功能划分)
2. [顺序设定](doc/publish.md#顺序设定)
1. [功能划分](doc/publish.md#功能组织)
2. [顺序设定](doc/publish.md#功能组织)

**[插件项目创建](doc/publish.md#插件项目创建)**

**[插件项目的发布](doc/publish.md#创建插件项目仓库)**
1. [创建插件项目仓库](doc/publish.md#插件项目创建)
2. [编写requirements](doc/publish.md#插件项目创建)
3. [编写readme](doc/publish.md#插件项目创建)
4. [插件的安装](doc/publish.md#插件项目创建)

1. [编写requirements](doc/publish.md#requirements)
2. [为Readme加入的插件头信息](doc/publish.md#编写readme)
3. [发布到ImagePy](doc/publish.md#发布到ImagePy)
**[发布到 ImagePy](doc/publish.md#发布到-ImagePy)**

**插件的安装与管理**
1. [给ImagePy发Pull Request](doc/publish.md#发布到-ImagePy)
2. [关于顶级菜单](doc/publish.md#发布到-ImagePy)

1. 通过连接安装插件](doc/publish.md#Widget
2. 插件管理器](doc/publish.md#Widget


## [文档编写](doc/document.md)

## [文档编写](doc/document.md#文档编写)
**[编写操作手册](doc/document.md#编写操作手册)**

为插件编写操作手册
**[查阅操作手册](doc/document.md#查阅操作手册)**



## [注意事项](doc/attention.md#注意事项)

1. [用户友好性](doc/attention.md#用户友好性)
2. [开发者友好性](doc/attention.md#开发者友好性)
3. [及时沟通](doc/attention.md#及时沟通)
**[用户友好性](doc/attention.md#用户友好性)**

**[开发者友好性](doc/attention.md#开发者友好性)**

**[及时沟通](doc/attention.md#及时沟通)**



**本篇文档相对系统的介绍了ImagePy的插件开发,但是依然无法详尽,关于更多ImagePy使用,开发上的问题请在[forum.Image.sc](https://forum.image.sc/)行进行讨论**
50 changes: 31 additions & 19 deletions doc/attention.md
Original file line number Diff line number Diff line change
@@ -1,49 +1,61 @@
#<span id = "注意事项">注意事项</span>
# 注意事项
虽然细节未能详尽,但我们大致介绍了插件的开发,发布,文档编写。这里提出一些开发过程中的注意事项。



## <span id = "用户友好性">用户友好性</span>
## 用户友好性

如果是自己用则可以无需过多花费精力,但希望其他用户可以使用自己的插件,那么用户友好性是非常重要的,这包括:

1. 合理的功能组织,将功能合理的划分,并用合适的标题展示。
2. 符合逻辑的交互方式,如插件的参数暴露能具有一定通用性但又不至于杂乱,工具的使用方式符合使用习惯。
3. 尽可能优化的性能体验,当然这一点是永无止境的,并且主要取决于算法,固然越快越好,等待总是糟糕的。
4. 言简意赅的文档,如果有精力,最好为插件编写操作手册,有必要可以图文并茂。
1. **合理的功能组织**

将功能合理的划分,并用合适的标题展示。

2. **合理的交互方式**

## <span id = "开发者友好性">开发者友好性</span>
如插件的参数暴露能具有一定通用性但又不至于杂乱,工具的使用方式符合使用习惯。

ImagePy将开发者友好性放在与用户友好性等同的地位,因为开发者与用户本是一个教学相长的群体,并且两者之间界线模糊,可以互相转化,这里介绍几个ImagePy的开发理念。
3. **言简意赅的文档**

1. ImagePy不是算法库,只是连接器
如果有精力,最好为插件编写操作手册,有必要可以图文并茂。

4. **尽可能优化的性能体验**

当然这一点是永无止境的,并且主要取决于算法,固然越快越好,等待总是糟糕的。



## 开发者友好性

**ImagePy将开发者友好性放在与用户友好性等同的地位**,因为开发者与用户本是一个教学相长的群体,并且两者之间界线模糊,可以互相转化,这里介绍几个ImagePy的开发理念。

1. **ImagePy不是算法库,只是连接器**

ImagePy不做算法,只提供必要的展示与交互,致力于让算法开发者用最少的代码将算法进行配置,整合到ImagePy,将算法转化为工具,给其他人甚至是非程序员使用。

2. 尽可能隔离UI
2. **尽可能隔离UI**

UI对于科研程序员总是不愉快的,ImagePy尽最大努力隔绝UI,多数的配置功能都可以通过para,view的配置来完成参数对话框的生成,而tool也抽象为mouse_down, mouse_up, mouse_move, mouse_wheel四个接口实现。而一些定制化很强的功能,不得不借助widget,只有这时才需要开发者自己编写UI相关的代码。
UI对于科研程序员总是不愉快的,ImagePy尽最大努力隔绝UI,多数的配置功能都可以通过`para`,`view`的配置来完成参数对话框的生成,而`tool`也抽象为`mouse_down`, `mouse_up`, `mouse_move`, `mouse_wheel`四个接口实现。而一些定制化很强的功能,不得不借助`widget`,只有这时才需要开发者自己编写UI相关的代码。

3. 以算法本身为核心
3. **以算法本身为核心**

ImagePy的图像数据基于Numpy,表格数据基于Pandas,矢量数据基于Shapely,这些都是通用数据结构,相当于Python科学计算的标准,ImagePy作为算法连通器,固然只能支持,而不能干涉算法的编写。因而开发者切不可将核心算法在run函数中实现,这样其他开发者将无法使用,开源的意义就大打折扣。算法,UI,事件混合,这导致ImageJ的算法代码无法被其他开发者调用,不得不大量使用IJ.run(...),或许ImageJ2正在极力改变这种情况,而这在ImagePy中是不被允许的用法。我们推荐的方法是
ImagePy的图像数据基于`Numpy`,表格数据基于`Pandas`,矢量数据基于`Shapely`,这些都是通用数据结构,相当于Python科学计算的标准,ImagePy作为算法连通器,固然只能支持,而不能干涉算法的编写。因而开发者*切不可将核心算法在`run`函数中实现*,这样其他开发者将无法使用,开源的意义就大打折扣。算法,UI,事件混合,这导致ImageJ1的算法代码无法被其他开发者调用,不得不大量使用`IJ.run(...)`,或许ImageJ2正在极力改变这种情况,而这在ImagePy中是不被允许的用法。我们推荐的方法是

1)如果你的插件只是实现很简单的数据操作,只有几行代码,那么OK,可以在run中实现。

2)如果你的算法相对复杂,那么最好将它写在一个单独的文件,并且这个模块中不要引用任何与ImagePy相关的模块,只基于Numpy,Pandas等标准科学计算库,这样以便他人可以拷贝出去,并且import使用
2)如果你的算法相对复杂,那么最好将它写在一个单独的文件,并且这个模块中不要引用任何与ImagePy相关的模块,只基于`Numpy`,`Pandas`等标准科学计算库,这样以便他人可以拷贝出去,并且`import`使用

3)如果你的算法意义重大,通用性很强,那么务必创建一个独立的算法项目,上传pypi,在插件项目中以引用的方式来使用。
3)如果你的算法意义重大,通用性很强,那么务必创建一个独立的算法项目,上传`pypi`,在插件项目中以引用的方式来使用。

4. 关于宏和headless
4. **关于宏和headless**

相比ImageJ,ImagePy的宏实现的功能非常有限,只支持已有功能流程化调用,无法用宏实现逻辑,这其实与ImagePy的设计理念紧密相关,只要开发者都能做到以算法本身为核心,让ImagePy充当纯粹的连接器,那么任何的算法调用,可以用Python简单的调用。Python已经如此简单强大,为什么还要另外学习一种晦涩而不通用的宏呢?同样,ImagePy也不会支持headless,因为一切功能以算法本身为核心,而ImagePy只提供交互,那么在headless情况下,ImagePy还有什么意义?又有什么非要借助ImagePy的呢?如果一切功能都可以以库的形式提供,那么开发者为什么希望编写headless代码,而不是纯粹的python代码?
相比ImageJ,ImagePy的宏实现的功能非常有限,只支持已有功能流程化调用,无法用宏实现逻辑,这其实与ImagePy的设计理念紧密相关,只要开发者都能做到以算法本身为核心,让ImagePy充当纯粹的连接器,那么任何的算法调用,可以用Python简单的调用。*Python已经如此简单强大,为什么还要另外学习一种晦涩而不通用的宏呢*?同样,ImagePy也不会支持`headless`,因为一切功能以算法本身为核心,而ImagePy只提供交互,那么在headless情况下,ImagePy还有什么意义?又有什么非要借助ImagePy的呢?如果一切功能都可以以库的形式提供,那么开发者为什么希望编写`headless`代码,而不是纯粹的python代码?



#<span id = "及时沟通">及时沟通</span>
## 及时沟通

相比ImageJ,ImagePy还只是一个孩子,框架和功能都还不够完善,但优势是,我们可以自由把控,即时调整,而不需要考虑背在身上的强大且庞大的插件体系。作为插件开发者,如果在插件开发过程中遇到任何困难,请随时与我们联系,尤其是当你觉得一个插件开发的很复杂时,那么很可能是因为我们的框架缺乏某方面的支持,我们可以随时讨论,在插件开发的同时,共同完善主框架。让ImagePy更好的实现连接器的价值,为用户和开发者服务。

ImagePy是 www.forum.image.sc 的合作伙伴,任何研发,使用方面的问题可以在上面进行讨论。
ImagePy是 www.forum.image.sc 的合作伙伴,任何研发,使用方面的问题可以在里面进行讨论。

14 changes: 10 additions & 4 deletions doc/document.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,26 @@



在插件项目的顶级目录下,创建doc文件夹,在文件夹里即可用markdown为你的插件编写操作文档了,需要注意的是文件名需要与插件的title一致,这样ImagePy的文档管理器即可将文档与插件进行关联。工具类型的插件与菜单类型的插件都可以编写文档。
## 编写操作手册

在插件项目的顶级目录下,创建`doc`文件夹,在文件夹里即可用`markdown`为你的插件编写操作文档了,需要注意的是文件名需要与插件的`title`一致,这样ImagePy的文档管理器即可将文档与插件进行关联。工具类型的插件与菜单类型的插件都可以编写文档。

`doc`下所有的`markdown`文件都会被解析并通过文件名关联给对应插件,所以这里并不强制要求文件组织方式,但我们强烈建议维护一个与插件目录一致的文档目录(创建`menus`,`tools`,`widgets`三个顶级目录),这样方便管理和维护,如果有必要我们可以加入多的目录文件,添加对应的跳转,这样整个`doc`目录也可以在github或其他在线环境中进行阅读。



## 查阅操作手册

当插件编写完成后,我们有如下方式对文档进行查阅:

1. 我们可以通过参数对话框的Help按钮

2. 工具栏图标上右键单击

3. 使用 **Plugins > Manager** 下的各种 **Tree View**
3. 使用 **`Plugins > Manager`** 下的各种 **`Tree View`**

![14](http://idoc.imagepy.org/demoplugin/31.png)

<div align=center>Hello World</div><br>
<div align=center>view doc from plugin tree view</div><br>


doc下所有的markdown文件都会被解析并通过文件名关联给对应插件,所以这里并不强制要求文件组织方式,但我们强烈建议维护一个与插件目录一致的文档目录,这样方便管理和维护,如果有必要我们可以加入多的目录文件,添加对应的跳转,这样整个doc目录也可以在github上进行阅读。
Loading