InDesign插件-常规功能开发-添加参考线-js脚本开发-ID插件

news2025/1/21 0:50:52

文章目录

    • 1.脚本执行概述
    • 2.InDesign 对象模型
    • 3.源码解析
    • 4.界面及结果
    • 5.总结

1.脚本执行概述

“脚本”面板和“脚本标签”面板概述,InDesign 包含两个用于脚本的面板:“脚本”面板和“脚本标签”面板。在“脚本”面板中可以运行脚本而不必离开 InDesign。“脚本”面板显示的是位于“InDesign 应用程序”文件夹和“偏好设置文件夹”下的”脚本“文件夹中的脚本。

选择“Windows”>“实用程序”>“脚本”打开脚本面板。如果创建或收到脚本,可将其放在“脚本面板”文件夹下,使其显示在“脚本”面板中。

macOS :Users/[用户名]/Library/Preferences/Adobe InDesign/[版本]/[语言]/Scripts/Scripts Panel
Windows XP : Documents and Settings[用户名]\Application Data\Adobe\InDesign[版本][语言]\Scripts\Scripts Panel
Windows Vista 和 Windows 7 : Users[用户名]\AppData\Roaming\Adobe\InDesign[版本][语言]\Scripts\Scripts Panel

例如作者机器上位于:C:\Users\ajz\AppData\Roaming\Adobe\InDesign\Version 15.0-J\zh_CN\Scripts\Scripts Panel

也可以放在系统脚本所在位置:C:\Program Files\Adobe\Adobe InDesign 2020\Scripts\Scripts Panel

在这里插入图片描述
在这里插入图片描述
本文开发一个功能,添加参考线。

2.InDesign 对象模型

当您考虑 InDesign 和 InDesign 文档时,您可能会在脑海中组织程序及其组件。您知道文本框架包含段落,而页面又包含文本框架。页面是跨页的一部分,一个或多个跨页组成一个文档。文档包含颜色、样式、图层和主跨页。当您考虑您创建的布局时,您会直观地理解它们是有顺序的。

InDesign 以相同的方式“思考”文档的内容。文档包含页面,页面包含页面项(文本框架、矩形、椭圆等)。文本框架包含字符、单词、段落和锚定框架;图形框架包含图像、EPS 文件或 PDF 文件;组包含其他页面项目。我们在这里提到的内容是构成 InDesign 出版物的对象,也是我们在编写 InDesign 脚本时使用的对象。

出版物中的对象按特定顺序排列:框架位于页面上,页面位于文档内,而文档位于 InDesign 应用程序对象内。当我们谈论对象模型或层次结构时,我们谈论的是这种结构。了解对象模型是找到要使用的对象的关键,而 InDesign 脚本的最佳指南是您对 InDesign 本身的了解。
对象具有属性。例如,文本对象的属性包括用于设置文本格式的字体、磅值和应用于文本的行距。

属性具有值;例如,文本的磅大小可以是数字(以磅为单位),也可以是用于自动引导的字符串“Auto”。文本的填充颜色属性可以设置为颜色、渐变、混合墨迹或色板。属性也可以是读/写或只读的。读/写属性可以设置为其他值;只读属性不能。

对象还具有方法,即脚本世界的动词,或者对象可以执行的操作。例如,document 对象具有 print、export 和 save 方法。方法具有定义方法效果的参数或值。例如,文档的 place 方法具有一个参数,用于定义要置入的文件。参数可以是必需的,也可以是可选的,具体取决于方法。

下图是 InDesign 对象模型的概述。该图不是 InDesign 脚本可用对象的完整列表;相反,它是用于理解对象类型之间关系的概念框架。
在这里插入图片描述

3.源码解析

显示一个脚本界面,与用户交互必要的参数选择,然后点击生成。

main();
function main(){
	//Make certain that user interaction (display of dialogs, etc.) is turned on.
	app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
	var myObjectList = new Array;
	if (app.documents.length != 0){
		if (app.selection.length != 0){
			for(var myCounter = 0;myCounter < app.selection.length; myCounter++){
				switch (app.selection[myCounter].constructor.name){
					case "Rectangle":
					case "Oval":
					case "Polygon":
					case "TextFrame":
					case "Group":
					case "Button":
					case "GraphicLine":
						myObjectList.push(app.selection[myCounter]);
						break;
				}
			}
			if (myObjectList.length != 0){
				var myOldXUnits = app.documents.item(0).viewPreferences.horizontalMeasurementUnits;
				var myOldYUnits = app.documents.item(0).viewPreferences.verticalMeasurementUnits;
				app.documents.item(0).viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;
				app.documents.item(0).viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;
				myDisplayDialog(myObjectList);
				//Comment out the previous line and uncomment the following line to use a ScriptUI dialog.
				//myDisplayScriptUIDialog(myObjectList);
				app.documents.item(0).viewPreferences.horizontalMeasurementUnits = myOldXUnits;
				app.documents.item(0).viewPreferences.verticalMeasurementUnits = myOldYUnits;
			}
			else{
				alert ("Please select a page item and try again.");
			}
		}
		else{
			alert ("Please select an object and try again.");
		}
	}
	else{
 	   alert ("Please open a document, select an object, and try again.");
	}
}
function myDisplayDialog(myObjectList){
	var myRangeButtons, myBasedOnButtons;
	var myLabelWidth = 100;
	var myDialog = app.dialogs.add({name:"AddGuides"});
	with(myDialog){
		with(dialogColumns.add()){
			with(borderPanels.add()){
				staticTexts.add({staticLabel:"Add Guides At:"});
				with(dialogColumns.add()){					
					var myTopCheckbox = checkboxControls.add({staticLabel:"&Top", checkedState:true});
					var myLeftCheckbox = checkboxControls.add({staticLabel:"&Left", checkedState:true});
					var myBottomCheckbox = checkboxControls.add({staticLabel:"&Bottom", checkedState:true});
					var myRightCheckbox = checkboxControls.add({staticLabel:"&Right", checkedState:true});
					var myXCenterCheckbox = checkboxControls.add({staticLabel:"&Horizontal Center", checkedState:true});
					var myYCenterCheckbox = checkboxControls.add({staticLabel:"&Vertical Center", checkedState:true});
					var myXPointCheckbox = checkboxControls.add({staticLabel:"Path Point Hori&zontal Anchor", checkedState:false});
					var myYPointCheckbox = checkboxControls.add({staticLabel:"Path Point Verti&cal Anchor", checkedState:false});
				}
			}
			with(borderPanels.add()){
				staticTexts.add({staticLabel:"Add Guides Around:"});
				with(myRangeButtons = radiobuttonGroups.add()){
					radiobuttonControls.add({staticLabel:"Each &Object", checkedState:true, minWidth:156});
					radiobuttonControls.add({staticLabel:"Entire &Selection"});
				}
			}
			with(borderPanels.add()){
				with(dialogColumns.add()){
					with(dialogRows.add()){
						with(dialogColumns.add()){
							staticTexts.add({staticLabel:"Guides Based On:"});
						}
						with(dialogColumns.add()){
							with(myBasedOnButtons = radiobuttonGroups.add()){
								radiobuttonControls.add({staticLabel:"&Geometric Bounds", checkedState:true, minWidth:160});
								radiobuttonControls.add({staticLabel:"V&isible Bounds"});
							}
						}
					}
					with(dialogRows.add()){
						with(dialogColumns.add()){
							staticTexts.add({staticLabel:"Horizontal Offset:", minWidth:myLabelWidth});
						}
						with(dialogColumns.add()){
							var myXOffsetField = measurementEditboxes.add({editValue:0, editUnits:MeasurementUnits.points});
						}
					}
					with(dialogRows.add()){
						with(dialogColumns.add()){
							staticTexts.add({staticLabel:"Vertical Offset:", minWidth:myLabelWidth});
						}
						with(dialogColumns.add()){
							var myYOffsetField = measurementEditboxes.add({editValue:0, editUnits:MeasurementUnits.points});
						}
					}
				}
			}
		}
	}
	myReturn = myDialog.show();
	if (myReturn == true){
		//Get control values from the dialog box.
		var myTop = myTopCheckbox.checkedState;
		var myLeft = myLeftCheckbox.checkedState;
		var myBottom = myBottomCheckbox.checkedState;
		var myRight = myRightCheckbox.checkedState;
		var myXCenter = myXCenterCheckbox.checkedState;
		var myYCenter = myYCenterCheckbox.checkedState;
		var myXPoint = myXPointCheckbox.checkedState;
		var myYPoint = myYPointCheckbox.checkedState;
		var myBasedOn = myBasedOnButtons.selectedButton;
		var myRange = myRangeButtons.selectedButton;
		var myXOffset = myXOffsetField.editValue;
		var myYOffset = myYOffsetField.editValue;
		//Remove the dialog box from memory.
		myDialog.destroy();
		if(myTop+myLeft+myBottom+myRight+myXCenter+myYCenter+myXPoint+myYPoint !=0){
			myAddGuides(myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myRange, myBasedOn, myXOffset, myYOffset, myXPoint, myYPoint, myObjectList);
		}
		else{
			alert("No guides were specified.");
		}
	}
	else{
		//Remove the dialog box from memory.
		myDialog.destroy();
	}
}
//ScriptUI version of the above dialog box.
function myDisplayScriptUIDialog(myObjectList){
	var myBasedOn, myRange;
	var myDialog = new Window('dialog', 'AddGuides');
	with(myDialog){
		alignChildren = 'fill';
		var myGuideTypesPanel = add('panel', undefined, "Add Guides At:");
		with(myGuideTypesPanel){
			orientation = 'column';
			alignChildren = 'left';
			margins = [12, 16, 12, 6];
			spacing = 4;
			myDialog.myTopCheckbox = add('checkbox', undefined, "Top");
			myDialog.myTopCheckbox.value = true;
			myDialog.myLeftCheckbox = add('checkbox', undefined, "Left");
			myDialog.myLeftCheckbox.value = true;
			myDialog.myBottomCheckbox = add('checkbox', undefined, "Bottom");
			myDialog.myBottomCheckbox.value = true;
			myDialog.myRightCheckbox = add('checkbox', undefined, "Right");
			myDialog.myRightCheckbox.value = true;
			myDialog.myXCenterCheckbox = add('checkbox', undefined, "Horizontal Center");
			myDialog.myXCenterCheckbox.value = true;
			myDialog.myYCenterCheckbox = add('checkbox', undefined, "Vertical Center");
			myDialog.myYCenterCheckbox.value = true;
			myDialog.myXPointCheckbox = add('checkbox', undefined, "Path Point Horizontal Anchor");
			myDialog.myXPointCheckbox.value = true;
			myDialog.myYPointCheckbox = add('checkbox', undefined, "Path Point Vertical Anchor");
			myDialog.myYPointCheckbox.value = true;
		}
		var myGuideLocationPanel = add('panel', undefined, "Add Guides Around:");
		with(myGuideLocationPanel){
			orientation = 'column';
			alignChildren = 'left';
			margins = [12, 14, 12, 6];
			spacing = 4;
			myDialog.myEachObjectRadioButton = add('radiobutton', undefined, "Each Object");
			myDialog.myEachObjectRadioButton.value = true;
			myDialog.myEntireSelectionRadioButton = add('radiobutton', undefined, "Entire Selection");
		}
		var myGuidesBasedOnPanel = add('panel', undefined, "Add Guides Based On:");
		with(myGuidesBasedOnPanel){
			orientation = 'column';
			alignChildren = 'left';
			margins = [12, 14, 12, 6];
			spacing = 4;
			myDialog.myGeometricBoundsRadioButton = add('radiobutton', undefined, "Geometric Bounds");
			myDialog.myGeometricBoundsRadioButton.value = true;
			myDialog.myVisibleBoundsRadioButton = add('radiobutton', undefined, "Visible Bounds");
			with(add('group')){
				orientation = 'row';
				alignChildren = 'center';
				spacing = 2;
				with(add('group')){
					orientation = 'column';
					alignChildren = 'right';
					var myXOffsetLabel = add('statictext', undefined, "Horizontal Offset:");	
					var myYOffsetLabel = add('statictext', undefined, "Vertical Offset:");
				}
				with(add('group')){
					orientation = 'column';
					alignChildren = 'right';
					myDialog.myXOffsetField = add('edittext', undefined, "0", {enterKeySignalsOnChange:false});
					myDialog.myXOffsetField.characters = 7;
					myDialog.myXOffsetField.justify = "right";
					myXOffsetField.onChange = function(){
						if(myValidateNumber(myXOffsetField.text)==false){
							alert("Invalid numeric entry!");
							myDialog.myXOffsetField.text = "0";
						}
					}	
					myDialog.myYOffsetField = add('edittext', undefined, "0");
					myDialog.myYOffsetField.justify = "right";
					myDialog.myYOffsetField.characters = 7;
					myYOffsetField.onChange = function(){
						if(myValidateNumber(myYOffsetField.text)==false){
							alert("Invalid numeric entry!");
							myDialog.myYOffsetField.text = "0";
						}
					}	
				}
				with(add('group')){
					orientation = 'column';
					alignChildren = 'left';
					add('statictext', undefined, "points");
					add('statictext', undefined, "points");
				}
			}
		}
		with(add('group')){
			orientation = 'row';
			alignment = 'right';
			myDialog.myCloseButton = add('button', undefined, "Close", {name:'cancel'});
			myDialog.myCloseButton.onClick = function(){myDialog.close()};
			myDialog.myOKButton = add('button', undefined, "OK", {name:'ok'});
		}
	}
	var myReturn = myDialog.show();
	if (myReturn == true){
		//Get control values from the dialog box.
		with(myDialog){
			var myTop = myTopCheckbox.value;
			var myLeft = myLeftCheckbox.value;
			var myBottom = myBottomCheckbox.value;
			var myRight = myRightCheckbox.value;
			var myXCenter = myXCenterCheckbox.value;
			var myYCenter = myYCenterCheckbox.value;
			var myXPoint = myXPointCheckbox.value;
			var myYPoint = myYPointCheckbox.value;
			var myXOffset = parseFloat(myXOffsetField.text);
			var myYOffset = parseFloat(myYOffsetField.text);
			if(myGeometricBoundsRadioButton.value == true){
				myBasedOn = 0;
			}
			else{
				myBasedOn = 1;
			}
			if(myEachObjectRadioButton.value == true){
				myRange = 0;
			}
			else{
				myRange = 1;
			}
		}
		myDialog.close();
		if(myTop+myLeft+myBottom+myRight+myXCenter+myYCenter+myXPoint+myYPoint !=0){
			myAddGuides(myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myRange, myBasedOn, myXOffset, myYOffset, myXPoint, myYPoint, myObjectList);
		}
		else{
			alert("No guides were specified.");
		}
	}
	else{
		myDialog.close();
	}
}
function myAddGuides(myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myRange, myBasedOn, myXOffset, myYOffset, myXPoint, myYPoint, myObjectList){
	var myLayer, myCounter;
	var myOldRulerOrigin = app.activeDocument.viewPreferences.rulerOrigin;
	app.activeDocument.viewPreferences.rulerOrigin = RulerOrigin.spineOrigin;
	//Create a layer to hold the printers marks (if it does not already exist).
	myLayer = app.activeDocument.layers.item("Guides");
	try{
		myLayerName = myLayer.name;
	}
	catch (myError){
		myLayer = app.activeDocument.layers.add({name:"Guides"});
	}
	//Process the objects in the selection.		
	for(myCounter = 0; myCounter < myObjectList.length; myCounter ++){
		var myObject = myObjectList[myCounter];
		if (myBasedOn == 0){
			myBounds = myObject.geometricBounds;
		}
		else{
			myBounds = myObject.visibleBounds;
		}
		//Draw guides at path point locations, if necessary.
		if ((myXPoint == true)||(myYPoint == true)){
			myDrawGuidesAtPathPoints(myObject, myXPoint, myYPoint);
		}
		//Set up some initial bounding box values.
		if ((myRange != 0)&&(myCounter==0)){
			myX1 = myBounds[1];
			myY1 = myBounds[0];
			myX2 = myBounds[3];
			myY2 = myBounds[2];
		}
		if(myRange == 0){
			myDrawGuides (myBounds[1], myBounds[0], myBounds[3], myBounds[2], myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myLayer, myXOffset, myYOffset);
		}
		else{
			//Compare the bounds values to the stored bounds.
			//If a given bounds value is less than (for x1 and y1) or 
			//greater than (for x2 and y2) the stored value,
			//then replace the stored value with the bounds value.
			if (myBounds[0] < myY1){
				myY1 = myBounds[0];
			}
			if (myBounds[1] < myX1){
				myX1 = myBounds[1];
			}
			if (myBounds[2] > myY2){
				myY2 = myBounds[2];
			}
			if (myBounds[3] > myX2){
				myX2 = myBounds[3];
			}
		}
	}
	if(myRange != 0){
		myDrawGuides (myX1, myY1, myX2, myY2, myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myLayer, myXOffset, myYOffset);
	}
	app.activeDocument.viewPreferences.rulerOrigin = myOldRulerOrigin;
}
function myDrawGuidesAtPathPoints(myObject, myXPoint, myYPoint){
	for(var myPathCounter = 0; myPathCounter < myObject.paths.length; myPathCounter++){
		for(var myPointCounter = 0; myPointCounter < myObject.paths.item(myPathCounter).pathPoints.length; myPointCounter ++){
			if(myXPoint==true){
				myDrawGuide(myObject.paths.item(myPathCounter).pathPoints.item(myPointCounter).anchor[0], 1);
			}
			if(myYPoint==true){
				myDrawGuide(myObject.paths.item(myPathCounter).pathPoints.item(myPointCounter).anchor[1], 0);
			}
		}
	}
}
function myDrawGuides(myX1, myY1, myX2, myY2, myTop, myLeft, myBottom, myRight, myXCenter, myYCenter, myLayer, myXOffset, myYOffset){
	if (myTop == true){
		myDrawGuide(myY1 - myYOffset, 0);
	}
	if (myLeft == true){
		myDrawGuide(myX1 - myXOffset, 1);
	}
	if (myBottom == true){
		myDrawGuide(myY2 + myYOffset, 0);
	}
	if (myRight == true){
		myDrawGuide(myX2 + myXOffset, 1);
	}
	if (myXCenter == true){
		myDrawGuide(myX1+((myX2-myX1)/2), 1);
	}
	if (myYCenter == true){
		myDrawGuide(myY1+((myY2-myY1)/2), 0);
	}
}
function myDrawGuide(myGuideLocation, myGuideOrientation){
	var myLayer = app.activeDocument.layers.item("Guides");
	with(app.activeWindow.activeSpread){
		if(myGuideOrientation == 0){
			with (guides.add(myLayer, undefined, undefined)){
				orientation=HorizontalOrVertical.horizontal;
				location=myGuideLocation;
			}
		}
		else{
			with (guides.add(myLayer, undefined, undefined)){
				orientation=HorizontalOrVertical.vertical;
				location=myGuideLocation;
			}
		}
	}
}
function  myValidateNumber(myString){
	var myRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
	return myRegExp.test(myString);
}

4.界面及结果

在这里插入图片描述

5.总结

该功能可以有效的帮助程序员掌握,参考线自动生成功能。读者可以参考使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python sanic框架钉钉和第三方打卡机实现

同样还是需要开通钉钉应用这里就不错多说了 第一步:梳理逻辑流程 前提&#xff1a;打卡的机器是使用postgres数据库&#xff0c;由于因为某些原因&#xff0c;钉钉userId 我已经提前获取到了存放到数据库里。 1.用户打卡成功后&#xff0c;我们应该监听数据库进行查询&#xf…

【教学类-35-07】17号的字帖(三)年份字帖“2023”(A4竖版1份)

作品展示 前四行是一个数字的描写 后四行是合并的年份4个数字 背景需求&#xff1a; 大4班17号孩子练习数字书写&#xff0c;上一次是“17”号和大“4”&#xff0c;第3份就是年份 【教学类-35-05】17号的学号字帖&#xff08;A4竖版1份&#xff09;-CSDN博客文章浏览阅读4…

数据结构--查找

目录 1. 查找的基本概念 2. 线性表的查找 3. 树表的查找 3.1 二叉排序树 3.1.1 定义: 3.1.2 存储结构&#xff1a; 3.1.3 二叉排序树的查找 3.1.4 二叉排序树的插入 3.1.5 二叉排序树删除 3.2 平衡二叉树&#xff08;AVL 3.2.1 为什么要有平衡二叉树 3.2.2 定义 3.3 B-树 3.3.1…

Flink1.17实战教程(第五篇:状态管理)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

Flink项目实战篇 基于Flink的城市交通监控平台(上)

系列文章目录 Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;上&#xff09; Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;下&#xff09; 文章目录 系列文章目录1. 项目整体介绍1.1 项目架构1.2 项目数据流1.3 项目主要模块 2. 项目数据字典2.1 卡口…

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…

RabbitMq知识概述

本文来说下RabbitMq相关的知识与概念 文章目录 概述AMQP协议Exchange 消息如何保证100&#xff05;投递什么是生产端的可靠性投递可靠性投递保障方案 消息幂等性高并发的情况下如何避免消息重复消费confirm 确认消息、Return返回消息如何实现confirm确认消息return消息机制 消费…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 两地三中心 两地三中心是一种信息技术架构模式,通常用于灾难恢复和业务连续性计划。这种模式设计有两个物理位置(两地),在这两个位置上部署了三个数据中心(三中心):一个主数据中心和两个备份数据中心…

电子邮件过滤软件SpamSieve mac高级功能

SpamSieve mac是一款电子邮件过滤软件&#xff0c;旨在帮助用户有效地识别和阻止垃圾邮件。该软件可通过机器学习算法自动学习您的邮箱中哪些邮件是垃圾邮件&#xff0c;哪些是正常邮件&#xff0c;并根据您的反馈不断优化过滤效果。 使用SpamSieve非常简单&#xff0c;只需将其…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是&#xff1a; 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

HTML的学习记录

<br /> 标签在 HTML 页面中创换行符。 <hr /> 标签在 HTML 页面中创建水平线。 段落是通过 <p> 标签定义的。 浏览器会自动地在段落的前后添加空行。&#xff08;<p> 是块级元素&#xff09; 文本格式 <b>This text is bold</b>字体加粗 …

腾讯云轻量应用服务器购买流程(两种方式)

腾讯云轻量应用服务器购买指南&#xff0c;有两个入口&#xff0c;一个是在特价活动上购买&#xff0c;一个是在轻量应用服务器官方页面购买&#xff0c;特价活动上购买价格更便宜&#xff0c;轻量2核2G3M带宽服务器62元一年起&#xff0c;阿腾云atengyun.com分享腾讯云轻量应用…

VS配置PCO相机SDK环境

VS配置PCO相机SDK环境 概述:最近要用到一款PCO相机,需要协调其他部件实现一些独特的功能。因此需要用到PCO相机的SDK,并正确配置环境。良好的环境是成功的一半。其SDK可以在官网下载,选择对应版本的安装即可。这里用的是pco.cpp.1.2.0 Windows,VS 2022 专业版。 链接: P…

阿里云 ACK 云上大规模 Kubernetes 集群高可靠性保障实战

作者&#xff1a;贤维 马建波 古九 五花 刘佳旭 引言 2023 年 7 月&#xff0c;阿里云容器服务 ACK 成为首批通过中国信通院“云服务稳定运行能力-容器集群稳定性”评估的产品&#xff0c; 并荣获“先进级”认证。随着 ACK 在生产环境中的采用率越来越高&#xff0c;稳定性保…

【python 的各种模块】(8) 在python使用matplotlib和wordcloud库来画wordcloud词云图

目录 目标&#xff1a;用python画出&#xff0c;网上流行的wordcloud词云图 1 准备工作 1.1环境准备 1.1.1安装步骤 1.2 资源准备 1.2.1 文本文件内容如下 1.2.2 图片资源 2 代码测试 2.1 第一版代码和效果 2.1.1 代码和效果 2.1.2 一般plt里解决中文乱码问题 2.1…

StackOverflowError的JVM处理方式

背景&#xff1a; 事情来源于生产的一个异常日志 Caused by: java.lang.StackOverflowError: null at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:908) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayL…

基于飞浆OCR的文本框box及坐标中心点检测JSON格式保存文本

OCR的文本框box及JSON数据保存 需求说明 一、借助飞浆框出OCR识别的文本框 二、以圆圈形式标出每个框的中心点位置 三、以JSON及文本格式保存OCR识别的文本 四、以文本格式保存必要的文本信息 解决方法 一、文本的坐标来自飞浆的COR识别 二、借助paddleocr的draw_ocr画出…

【数据库系统概论】第4章-数据库安全性

复习用&#xff0c;别看了 文章目录 4.1 计算机安全性概述4.2 数据库安全性控制4.2.1 用户标识和鉴定4.2.2 存取控制4.2.3 自主存取控制方法4.2.4 数据库角色4.2.5 强制存取控制 4.3 视图机制4.4 审计4.5 数据加密4.6 其他安全性保护 4.1 计算机安全性概述 不安全因素 4.2 …

项目管理计划(word版21页)

本计划的主要目的是通过本方案明确本项目的项目管理体系。方案的主要内容包括&#xff1a;明确项目的目标及工作范围&#xff0c;明确项目的组织结构和人员分工&#xff0c;确立项目的沟通环境&#xff0c;确立项目进度管理方法&#xff0c;明确项目跟踪和监控方式&#xff0c;…

代理模式:中间者的故事

代理模式&#xff1a;中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析&#xff0c;仅供学习使用 需求&#xff1a;小明拜托自己好朋友小王给他朋友小美…