- 浏览: 655686 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (170)
- Android (10)
- Java (35)
- PHP (3)
- Linux (3)
- Powerdesigner (2)
- dedcms (1)
- nginx (1)
- Flex (9)
- REST (2)
- Google App Engine (1)
- mysql (6)
- JAVA开源项目 (1)
- Eclipse (18)
- Eclipse Orion (1)
- Dojo (2)
- UML (1)
- Eclipse GEF EMF (4)
- Eclipse 插件开发 (6)
- OSGI (2)
- DeDeCMS (1)
- Maqetta (2)
- JavaScript (1)
- nginx php (1)
- Dojo V1.7 (2)
- Spring3 (4)
- Hibernate3 (4)
- MongoDB (3)
- Scala (2)
- DSL (1)
- Python (3)
- Maven (1)
- Tomcat (3)
- XMPP (2)
- Apache (4)
- NodeJS (1)
- SQLSERVER (2)
- HTML5 (1)
- Nexus (1)
- web服务器 (2)
- Jetty (2)
- weixin (1)
- ngrok (1)
- 网络与信息安全 (1)
最新评论
-
wangyudong:
配置有点晕,开源社区上找了一个开源的Holer,只需要设置Ac ...
用ngrok实现外网访问本地WEB项目的方法 -
lolo968:
你收集的资料没有链接
基于OSGI的框架开发小结(转) -
smartdog:
使用的maven的版本很老的,而且写的不是很清楚,建议可以参考 ...
Maven多项目依赖配置 -
Tom.X:
OSGi联盟官网:http://osgia.com
基于OSGI的框架开发小结(转) -
Miller003:
你好,我在本地测试时,删除catalina.jar和tomca ...
基于Tomcat7的HTML5 WebSocket 应用示例
今天终于可以闲一天,想来想去就乱写点东西吧,说不定对有些新人有点帮助呢~_~
用Eclipse API的方式来打开编辑器,可能对任何一个插件开发者都不是很陌生的操作了。但是,还是建议你忍着看一下,全当是复习吧~_~。
【打开editor的接口讨论】
先来看一下workbench吧,workbench从静态划分应该大致如下:
从结构图我们大致就可以猜测出来,workbench page作为一个IWorkbenchPart(无论是eidtor part还是view part)的容器,肯定会接受workbench page的管理。看了一下,IWorkbenchPage接口定义中确实提供给了如下打开编辑器的操作:
【IWokbenchPage提供的接口】
1 public interface IWorkbenchPage extends IPartService, ISelectionService,ICompatibleWorkbenchPage {
2
3 public IEditorPart openEdito(IEditorInput input, String editorId)throws PartInitException;
4
5 public IEditorPart openEdito(IEditorInput input, String editorId, boolean activate) throws PartInitException;
6
7 public IEditorPart openEditor(final IEditorInput input, final String editorId, final boolean activate, final int matchFlags)throws PartInitException;
8 }
2
3 public IEditorPart openEdito(IEditorInput input, String editorId)throws PartInitException;
4
5 public IEditorPart openEdito(IEditorInput input, String editorId, boolean activate) throws PartInitException;
6
7 public IEditorPart openEditor(final IEditorInput input, final String editorId, final boolean activate, final int matchFlags)throws PartInitException;
8 }
那到这边,可能很多人已经知道了怎么调用这些接口了:
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(...)
(说明:PlatformUI可以看作是整个eclipse ui框架的门面类,当然最核心的作用就是让用户获取到workbench。Eclipse中存在的其他一些门面类如:ResourcesPlugin、Platform、JavaCore、JavaUI等)
我们再仔细看一下IWorkbenchPage对应的实现类(org.eclipse.ui.internal.WorkbenchPage)中的以上接口的实现代码,真正在管理Editor的是一个叫做EditorManager的东东(同理,view part对应的管理器角色类是叫做ViewFactory的东东)。这里的EditorManager和View Factory是workbench实现中非常精华的部分,看一下里面的实现就会很大程度上理解workbench所谓懒加载、懒初始化是如何实现的了,如何实现part 复用的...等等。
上图就用来说明workbench是如何来管理各种part的,其中descriptor角色的核心作用是延迟加载扩展(延迟加载用户通过editors或者views提供的扩展),reference角色的核心作用是用来延迟初时化具体的part(例如避免过早的创建对应的control等等)。再说下去有点偏离主题了,这部分,以后有时间再写
【IDE工具类提供的接口】
上面IWorkbenchPage提供接口都需要用户准备两样东西:一是创建IEditorInput实例,二是指定editor id。有些用户可能不想干这两件事情,所以在工具类org.eclipse.ui.ide.IDE中提供了其他的接口:
1 public static IEditorPart openEditor(IWorkbenchPage page, IFile input) throws PartInitException { }
2
3 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, boolean activate) throws PartInitException { }
4
5 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, boolean activate, boolean determineContentType) { }
6
7 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId) throws PartInitException { }
8
9 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId, boolean activate) throws PartInitException { }
10
11
上面5个接口操作中, 对于上面的三个操作,Eclipse会自动为你准备IEditorInput实例,并动态绑定合适的编辑器类型。对于下面的两个操作,Eclipse会为你自动准备IEditorInput实例,但是需要用户自己指定editor id。2
3 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, boolean activate) throws PartInitException { }
4
5 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, boolean activate, boolean determineContentType) { }
6
7 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId) throws PartInitException { }
8
9 public static IEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId, boolean activate) throws PartInitException { }
10
11
接下来我们看两个问题,一是如何创建IEditorInput实例的;而是如何动态计算对应的editor id的。
【有关FileEditorInput】
在IDE工具类中提供的5个接受IFile对象的openEditor接口中,在对应的实现中都是默认构造了一个FileEditorInput(org.eclipse.ui.part.FileEditorInput)实例,这个实例也是org.eclipse.ui.IFileEditorInput接口的默认实现类(注意:Eclipse中很多地方都使用这种Interface/Default Impl的方式,Interface会暴露,Default Impl则根据情况选择是否暴露,一般是如果Interface希望用户来扩展继承,则会暴露对应的Default Impl,如果Interface不希望用户来扩展继承,例如IResource系列接口,则一般会将Default Impl丢如对应的internal包中)。
我们看一下org.eclipse.ui.part.FileEditorInput中是如何实现IEditorInput.exists()接口的:
1 public class FileEditorInput implements IFileEditorInput,IPathEditorInput,IPersistableElement {
2 private IFile file;
3
4 public boolean exists() {
5 return file.exists();
6 }
7 }
我们看到内部的实现是持有了IFile句柄,如果IFile代表的资源没有存在于工作区之内,那么就会返回false。(疑问:如果我们打开工作区外部的文件呢???显然,FileEditorInput并不合适,稍后看...)2 private IFile file;
3
4 public boolean exists() {
5 return file.exists();
6 }
7 }
【动态计算editor id】
下面,我们再来看一下IDE类是如何计算所谓的默认eidtor id的。追踪实现,我们看到了IDE.getDefaultEditor
1 public static IEditorDescriptor getDefaultEditor(IFile file, boolean determineContentType) {
2 // Try file specific editor.
3 IEditorRegistry editorReg = PlatformUI.getWorkbench()
4 .getEditorRegistry();
5 try {
6 String editorID = file.getPersistentProperty(EDITOR_KEY);
7 if (editorID != null) {
8 IEditorDescriptor desc = editorReg.findEditor(editorID);
9 if (desc != null) {
10 return desc;
11 }
12 }
13 } catch (CoreException e) {
14 // do nothing
15 }
16
17 IContentType contentType = null;
18 if (determineContentType) {
19 contentType = getContentType(file);
20 }
21 // Try lookup with filename
22 return editorReg.getDefaultEditor(file.getName(), contentType);
23 }
上面的代码大致赶了如下两件事情:2 // Try file specific editor.
3 IEditorRegistry editorReg = PlatformUI.getWorkbench()
4 .getEditorRegistry();
5 try {
6 String editorID = file.getPersistentProperty(EDITOR_KEY);
7 if (editorID != null) {
8 IEditorDescriptor desc = editorReg.findEditor(editorID);
9 if (desc != null) {
10 return desc;
11 }
12 }
13 } catch (CoreException e) {
14 // do nothing
15 }
16
17 IContentType contentType = null;
18 if (determineContentType) {
19 contentType = getContentType(file);
20 }
21 // Try lookup with filename
22 return editorReg.getDefaultEditor(file.getName(), contentType);
23 }
1、如果对应的资源设定了一个特定的持久化属性EDITOR_KEY,则会使用EDITOR_KEY属性值所代表的编辑器(说明:有关Eclipse资源的属性支持,请参阅其他文档)。那如果一个资源不在工作区之内,又如何设定EDITOR_KEY属性呢??? (~_~确实没法设定)
2、查找对应的content type,用户通过org.eclipse.core.runtime.contentTypes扩展点来注册自定义的内容类型,在内容类型中会指定对应的文件扩展名和默认编码,例如JDT中注册了如下内容类型(摘自org.eclipse.jdt.core/plugin.xml):
<!-- =================================================================================== -->
<!-- Extension: Java Content Types -->
<!-- =================================================================================== -->
<extension point="org.eclipse.core.runtime.contentTypes">
<!-- declares a content type for Java Properties files -->
<content-type id="javaProperties" name="%javaPropertiesName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-extensions="properties"
default-charset="ISO-8859-1"/>
<!-- Associates .classpath to the XML content type -->
<file-association
content-type="org.eclipse.core.runtime.xml"
file-names=".classpath"/>
<!-- declares a content type for Java Source files -->
<content-type id="javaSource" name="%javaSourceName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-extensions="java"/>
<!-- declares a content type for Java class files -->
<content-type id="javaClass" name="%javaClassName"
priority="high"
file-extensions="class">
<describer
class="org.eclipse.core.runtime.content.BinarySignatureDescriber">
<parameter name="signature" value="CA, FE, BA, BE"/>
</describer>
</content-type>
<!-- declares a content type for JAR manifest files -->
<content-type id="JARManifest" name="%jarManifestName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-names="MANIFEST.MF"
default-charset="UTF-8"/>
</extension>
那如果我们在注册编辑器的时候和对应的content type绑定,这不就联系起来了吗~_~。那我们看一下java源码编辑器扩展描述(摘自org.eclipse.jdt.ui/plugin.xml):<!-- Extension: Java Content Types -->
<!-- =================================================================================== -->
<extension point="org.eclipse.core.runtime.contentTypes">
<!-- declares a content type for Java Properties files -->
<content-type id="javaProperties" name="%javaPropertiesName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-extensions="properties"
default-charset="ISO-8859-1"/>
<!-- Associates .classpath to the XML content type -->
<file-association
content-type="org.eclipse.core.runtime.xml"
file-names=".classpath"/>
<!-- declares a content type for Java Source files -->
<content-type id="javaSource" name="%javaSourceName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-extensions="java"/>
<!-- declares a content type for Java class files -->
<content-type id="javaClass" name="%javaClassName"
priority="high"
file-extensions="class">
<describer
class="org.eclipse.core.runtime.content.BinarySignatureDescriber">
<parameter name="signature" value="CA, FE, BA, BE"/>
</describer>
</content-type>
<!-- declares a content type for JAR manifest files -->
<content-type id="JARManifest" name="%jarManifestName"
base-type="org.eclipse.core.runtime.text"
priority="high"
file-names="MANIFEST.MF"
default-charset="UTF-8"/>
</extension>
<editor
name="%JavaEditor.label"
default="true"
icon="$nl$/icons/full/obj16/jcu_obj.gif"
contributorClass="org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditorActionContributor"
class="org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor"
symbolicFontName="org.eclipse.jdt.ui.editors.textfont"
id="org.eclipse.jdt.ui.CompilationUnitEditor">
<contentTypeBinding
contentTypeId="org.eclipse.jdt.core.javaSource"
/>
</editor>
name="%JavaEditor.label"
default="true"
icon="$nl$/icons/full/obj16/jcu_obj.gif"
contributorClass="org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditorActionContributor"
class="org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor"
symbolicFontName="org.eclipse.jdt.ui.editors.textfont"
id="org.eclipse.jdt.ui.CompilationUnitEditor">
<contentTypeBinding
contentTypeId="org.eclipse.jdt.core.javaSource"
/>
</editor>
我们看到上面的xml中有contentTypeBinding元素,里面指定了绑定java源码content type。
那如果我们在注册编辑器的时候,没有绑定对应的content type呢?Eclipse允许你配置,往下看:
1、查看资源本身是否有EIDTOR_ID持久属性(注意:一、只有工作区中存在的资源才允许设置持久属性;二、资源属性知识针对特定资源,不会影响同类型资源,即你对工作区中特定的.java文件设定了EIDTOR_ID持久属性,并不会影响工作区中其他.java文件资源的编辑器绑定操作)
2、查找对应的content type,然后查找对应的editor扩展或者查找Eclipse中的Content Types和File Associations配置
3、如果都找不到,则直接给一个默认的编辑器。例如,我们经常碰到是"org.eclipse.ui.DefaultTextEditor"
【IDE工具类提供的接口 VS IWorkbenchPage提供的接口】
看一下以上提到的各个角色之间的调用关系图吧:
【使用Eclipse提供的打开editor的接口】
还是那句话,需求决定一切。我们看一下打开编辑器的需求:
1、打开工作区中工程内的文件资源
2、打开工作区.metadata目录中的文件资源
3、打开工作区外部的文件资源
【说明】Eclipse工作区实际上是有数据区和元数据区两个区域组成的,示意如下:
对于Eclipse来说,.metadata目录下存放的是插件运行时的关键状态数据,不建议用户再工作区实例运行期间做相应修改,为此eclipse干了两件事情:1、运行期间会自动在.metadata目录下产生一个进程锁定的.lock文件;2、Eclipse不允许用户通过IResource系列接口直接访问或修改.meatadata目录下的资源
【打开工作区工程内的资源】
假设工作区中有测试工程TestProject,工程下有文本文件java_file.txt。对应创建代码如下:
1 try {
2 //创建工程
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4 if (!project.exists())
5 project.create(null);
6 if (!project.isOpen())
7 project.open(null);
8
9 //创建文件
10 IFile java_file = project.getFile(new Path("/java_file.txt"));
11 InputStream inputStreamJava = new ByteArrayInputStream("class MyType{}".getBytes());
12 if (!java_file.exists())
13 java_file.create(inputStreamJava, false, null);
14 } catch (CoreException e) {
15 IStatus status = new Status(IStatus.ERROR, "myplugin", 101, "创建资源失败", e);
16 Activator.getDefault().getLog().log(status);
17 }
2 //创建工程
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4 if (!project.exists())
5 project.create(null);
6 if (!project.isOpen())
7 project.open(null);
8
9 //创建文件
10 IFile java_file = project.getFile(new Path("/java_file.txt"));
11 InputStream inputStreamJava = new ByteArrayInputStream("class MyType{}".getBytes());
12 if (!java_file.exists())
13 java_file.create(inputStreamJava, false, null);
14 } catch (CoreException e) {
15 IStatus status = new Status(IStatus.ERROR, "myplugin", 101, "创建资源失败", e);
16 Activator.getDefault().getLog().log(status);
17 }
打开方式一:Eclipse默认计算对应的editor id,会用default text editor打开
1 try {
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 IDE.openEditor(page, java_file);
7 } catch (CoreException e) {
8 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
9 Activator.getDefault().getLog().log(status);
10 }
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 IDE.openEditor(page, java_file);
7 } catch (CoreException e) {
8 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
9 Activator.getDefault().getLog().log(status);
10 }
打开方式二:指定java源码编辑器打开,会用java源码编辑器打开
1 try {
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 IDE.openEditor(page, java_file, "org.eclipse.jdt.ui.CompilationUnitEditor");
7 } catch (CoreException e) {
8 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
9 Activator.getDefault().getLog().log(status);
10 }
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 IDE.openEditor(page, java_file, "org.eclipse.jdt.ui.CompilationUnitEditor");
7 } catch (CoreException e) {
8 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
9 Activator.getDefault().getLog().log(status);
10 }
打开方式三:设定editor id属性,该文件以后默认都用此editor id打开
1 try {
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 java_file.setPersistentProperty(IDE.EDITOR_KEY, "org.eclipse.jdt.ui.CompilationUnitEditor");
7 IDE.openEditor(page, java_file);
8 } catch (CoreException e) {
9 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
10 Activator.getDefault().getLog().log(status);
11 }
2 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
3 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("TestProject");
4
5 IFile java_file = project.getFile(new Path("/java_file.txt"));
6 java_file.setPersistentProperty(IDE.EDITOR_KEY, "org.eclipse.jdt.ui.CompilationUnitEditor");
7 IDE.openEditor(page, java_file);
8 } catch (CoreException e) {
9 IStatus status = new Status(IStatus.ERROR, "myplugin", 102, "打开工作区内文件出错", e);
10 Activator.getDefault().getLog().log(status);
11 }
说明:对于工作区工程内的资源,可以有两种方式:一是local的,那就是物理存在与工程之内;二是link进入的。打开编辑器的时候,不需要做区分。
【打开工作区外部的资源】
说明:既存在于工作区外部,同时又没有被link进工程。
在Eclipse中有个功能,就是File->Open File,可以打开一个外部文件。那我们看一下它是怎么实现的。我们只需要打开对应的对话框,然后挂起主线程,就可以找到对应的action了(挂起线程可以帮我们很方便的调试很多类型的问题,以后细说~_~):
分析一下OpenExternalFileAction的实现,我们发现它自己构建了一个editor input
发表评论
-
Invalid signature file digest for manifest main attributes
2012-04-22 20:43 4957自己以前曾写过一篇关于如何把第三方jar包打包成ecl ... -
插件开发中如何正确使用第三方jar包
2012-04-21 20:48 2475在进行eclipse插件开发过程中,除了引用Eclipse本身 ... -
Eclipse 平台提供的扩展点
2012-01-09 21:49 1600Eclipse平台SDK支持的扩展点org.eclipse.a ... -
Eclipse 插件之多页编辑器的实现
2012-01-02 14:00 4281在GEF的开发中,多页标签编辑器是一种常见的实现,其实现 ... -
动态的刷新PALETTE里的内容(转)
2011-12-28 10:56 1243最近做了一个任务,要求把一个grahpical editor里 ...
相关推荐
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
weixin138社区互助养老+ssm(论文+源码)_kaic.zip
光纤到户及通信基础设施报装申请表.docx
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
功能完善的电商数据智能爬虫采集系统项目全套技术资料.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
### Android程序开发初级教程(一):初识Android **平台概述** Google推出的Android操作系统平台已经正式亮相,这是一个基于Linux内核的开源操作系统。对于开发者而言,了解其架构和支持的开发语言至关重要。以下是Android平台的架构概览: **平台架构及功能** 1. **应用框架(Application Framework)**:包含可重用和可替换的组件,确保所有软件在该层面上的平等性。 2. **Dalvik虚拟机(Dalvik Virtual Machine)**:一个基于Linux的虚拟机,为Android应用提供运行环境。 3. **集成浏览器(Integrated Browser)**:基于开源WebKit引擎的浏览器,位于应用层。 4. **优化图形(Optimized Graphics)**:包括自定义的2D图形库和遵循OpenGL ES 1.0标准的3D实现。 5. **SQLite数据库**:用于数据存储。 6. **多媒体支持(Media Support)**:支持通用音频、视频以及多种图片格式(如MPEG4, H.264
内容概要:本文档是《组合数学答案-网络流传版.pdf》的内容,主要包含了排列组合的基础知识以及一些经典的组合数学题目。这些题目涵盖了从排列数计算、二项式定理的应用到容斥原理的实际应用等方面。通过对这些题目的解析,帮助读者加深对组合数学概念和技巧的理解。 适用人群:适合初学者和有一定基础的学习者。 使用场景及目标:可以在学习组合数学课程时作为练习题参考,也可以在复习考试或准备竞赛时使用,目的是提高解决组合数学问题的能力。 其他说明:文档中的题目覆盖了组合数学的基本知识点,适合逐步深入学习。每个题目都有详细的解答步骤,有助于读者掌握解题思路和方法。
.net core mvc在线考试系统asp.net考试系统源码考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
包含了登陆注册、用户管理、部门管理、文件管理、权限管理、日志管理、个人中心、数据字典和代码生成这九个功能模块 系统采用了基于角色的访问控制,角色和菜单关联,一个角色可以配置多个菜单权限;然后再将用户和角色关联,一位用户可以赋予多个角色。这样用户就可以根据角色拿到该有的菜单权限,更方便管理者进行权限管控。 本系统还封装了文件管理功能,在其他模块如若要实现图片/文件上传预览时,前端只需导入现成的 Vue 组件即可实现(使用 viewerjs 依赖实现),后端只需定义 String 类型的实体类变量即可,无需再去研究文件上传预览的相关功能,简化了开发者的工作量。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
三相10Kw光伏并网逆变器。包含全套理图 PCB 源代码
GJB 5236-2004 军用软件质量度量文档,本称准规定了车用软件产品的质重模型和基本的度量。本标准为确定车用软件质量需求和衡量军用 软件产品的能力提供了一个框架。
基于MATLAB车牌识别系统【GUI含界面】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【宿舍管理系统】是一种专为高校或住宿机构设计的信息化解决方案,旨在提高宿舍管理的效率和准确性。该系统包含了多项核心功能,如宿舍管理员管理、宿舍信息维护、查询、卫生检查以及电费缴纳等,旨在实现全面的宿舍运营自动化。 **宿舍管理员管理**功能允许指定的管理员进行用户权限分配和角色设定。这包括对管理员账户的创建、修改和删除,以及设置不同的操作权限,例如只读、编辑或管理员权限。通过这样的权限控制,可以确保数据的安全性和管理的规范性。 **宿舍添加与管理**是系统的基础模块。管理员可以录入宿舍的基本信息,如宿舍号、楼栋、楼层、房间类型(单人间、双人间等)、容纳人数、设施配置等。此外,系统还支持批量导入或导出宿舍信息,方便数据的备份和迁移。 **查询功能**是系统的重要组成部分,它允许管理员和学生根据不同的条件(如宿舍号、楼栋、学生姓名等)快速查找宿舍信息。此外,系统还可以生成各种统计报告,如宿舍占用率、空闲宿舍数量等,以便于决策者进行资源优化。 **卫生检查**功能则是对宿舍卫生状况进行定期评估。管理员可设定检查计划,包括检查周期、评分标准等,并记录每次检查的结果。系统能自动生成卫生报表,用于
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
九缸星形发动机点火器3D
本项目可以作为小程序毕设项目,主要功能为音乐播放器,主要功能是:可以播放歌曲(采用mp3网络连接实现)、专辑封面播放时可以旋转,能够实现开始和暂停播放,可以点击下一首歌曲,主页面实现动态轮播图
出差审批单(表格模板).docx