500行JavaScript代码在前端根据数据生成CAD工程剖面图

前言

​ 用数据生成CAD图,一般采用的ObjectArx对CAD二次开发完成。ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能访问和创建AutoCAD图形数据库。而由于现在懂C++的人少,很多人对C++有点望而生畏。则JavaScript 是互联网上最流行的脚本语言,用户群体很大。那有没有可能利用JavaScript来进行数据成图?

今天和大家聊聊,怎么用500行JavaScript代码,根据数据在前端创建一个Dwg格式的工程剖面图。

效果

先上效果图
image-20230303195106114

datatodwg.gif

它支持哪些功能?

  • 支持CAD的27种实体类型的创建,如线、文字、填充等
  • 支持对DWG图中实体进行修改、克隆、删除等操作
  • 支持创建CAD图层、线型、块定义、文字样式
  • 支持从外部图形中拷贝实体到当前创建的CAD图中
  • 支持块属性文字的创建和设置
  • 对创建好的CAD图形数据能以GeoJson的格式在前端直接展示,同时能选中移动等操作
  • 对创建好的CAD图形能在前端展示,同时能点击弹出实体类型等属性
  • 能导出成DWG图形

实现原理

image-20230303202058333

(1) 对剖面图中不变的元素如图例做成模板。创建图时直接拷贝这些实体即可。对于图签可以外部图形插入,同时图签中需要修改的文字内容如制图人或日期等字段,可以块属性文字的方式在创建时以属性赋值的方式来进行创建。如上面生成的剖面图的模板来源于下面这两个模板图形。
剖面图模板:image-20230303202523238

图签模板:(其中单位和日期是块属性文字,支持插入的时候输入属性值进行修改)

image-20230303202615419

(2) 获取要创建的绘图数据,示例中对数据进行了模拟生成。

(3) 根据唯杰地图https://vjmap.com/ SDK中提供创建CAD实体类型的方法创建相关实体。
唯杰地图SDK支持的实体类型有DbLine直线、DbCurve曲线、Db2dPolyline二维折线、Db3dPolyline三维多段线、DbPolyline多段线、BlockReference块参照、DbArc圆弧、DbCircle圆、DbEllipse椭圆、DbHatch填充、Text单行文本、DbMText多行文本、RasterImage栅格图片、DbShape型实体、Spline样条曲线、Wipeout遮罩实体、Dimension标注、Db2LineAngularDimension角度标注[两条线]、Db3PointAngularDimension角度标注[三点]、DbAlignedDimension对齐标注、DbArcDimension圆弧标注、DbDiametricDimension直径标注、DbOrdinateDimension坐标标注、DbRadialDimension半径标注、DbRadialDimensionLarge半径折线标注、DbRotatedDimension转角标注、AcDbAttributeDefinition属性注记、AcDbAttribute块属性、DbLayer图层、DbTextStyle文字样式、DbDimStyle标注样式、DbLinetypeStyle线型样式、DbBlock块定义、DbDocument数据库文档。

如何减少代码量可以用如下方法:

  • 技巧一:可以直接拷贝模板中的实体,对实体的属性进行修改。这样能少赋值参数,减少代码量。
  • 技巧二:对于重复的对象,可以创建块,变化的文字,以块属性文字定义。再重复创建块参照,修改属性文字。

(4) 把创建的数据生成一个JSON对象,调用唯杰地图服务,后台创建DWG图形。

(5) 把后台创建的DWG图形数据以GeoJson数据或GIS瓦片的格式返回给前端进行展示。对于图不大的情况,可用GeoJson数据进行展示。如果图大时,GeoJson数据量大,数据返回慢,渲染也会受影响,这时建议用GIS栅格瓦片或矢量瓦片的时候进行绘制。

在线体验地址

https://vjmap.com/demo/#/demo/map/comprehensive/03datatodwgmap

应用场景

能在前端通过JavaScript创建CAD格式的DWG图形,极大的降低了数据生成CAD图的门槛,具有很广泛的应用场景。例如,在建筑和工程领域,DWG文件是广泛使用的标准文件格式,如工程中常用的一些等值线图、剖面图、水位图等;建筑、交通等不同行业中的相关图纸都可以用这个来生成DWG图形。偷个懒,让目前很火的ChatGPT来总结下吧:

image-20230303213354454

全部实现代码

// --数据自动生成CAD工程剖面图--根据数据在前端创建生成CAD格式的工程剖面图形
// 剖面图模板来源地图id和版本
let templateSectId = "template_sect";
let templateSecVersion = "v1";
// 图框模板来源id和版本
const templateTkMapId = "template_tk";
const templateTkVersion = "v1";
// 注:以下所的有objectid来源方法为:
// 在唯杰云端管理平台 https://vjmap.com/app/cloud 里面以内存方式打开模板图,然后点击相应实体,在属性面板中获取object值
// 或者以几何渲染方式打开模板图,点击相应实体,在属性面板中获取object值,如果是块实体(objectid中有多个_),取第一个_前面的字符串
let svc = new vjmap.Service(env.serviceUrl, env.accessToken);
// 获取模板信息
let tplInfo;
// 获取模板中的信息
const getTemplateInfo = async (templateSectId, version) => {let features = await getTemplateData(templateSectId, version);// 获取所有填充符号。先获取 填充符号 图层中的所有文字,文字上面的hatch就是填充符号let hatchInfos = features.filter(f => f.layername == "填充符号" && f.name == "AcDbMText").map(t => {let hatch = features.filter(f => f.layername == "填充符号" && f.name == "AcDbHatch").find(h =>// 填充垂直方向位于文字上方,并且距离不能超过文字高度两倍,水平方向包含文字中心点水平方向h.envelop.min.y > t.envelop.max.y &&h.envelop.min.y - t.envelop.max.y < t.envelop.height() * 2 &&h.envelop.min.x <= t.envelop.center().x &&h.envelop.max.x >= t.envelop.center().x)if (!hatch) return;return {name: t.text,hatchObjectId: hatch.objectid}})// 获取绘制开始的位置线let lineInfo = features.filter(f => f.layername == "线" && f.name == "AcDbLine");let startLine;if (lineInfo.length > 0) {startLine = {objectId: lineInfo[0].objectid,positon: [lineInfo[0].envelop.min.x, lineInfo[0].envelop.min.y]}}return {startLine,hatchInfos}
}// 模拟数据
const mockData = (hatchNames, minCount) => {// 对填充符号次序先随机排序下,这样每次生成次序就不一样了hatchNames.sort(() => Math.random() - 0.5);let data = [];// 孔口个数let kongCount = vjmap.randInt(minCount, minCount * 2);for(let i = 0; i < kongCount; i++) {let item = {name: '孔' + (i + 1),x: 15 * (i + 1) + vjmap.randInt(0, 10) + 1000, // 孔口坐标x 生成随机数xy: vjmap.randInt(100, 105), // 孔口坐标y 生成随机数ystratums: [] // 分层数据}// 生成每层的信息let stratumCount = vjmap.randInt(5, hatchNames.length - 1);let stratumAllThickness = 0;for(let k = 0; k < stratumCount; k++) {const thickness = vjmap.randInt(2, 6) // 随机生成一个厚度item.stratums.push({hatch: hatchNames[k],thickness: thickness})stratumAllThickness += thickness;}item.stratumsThickness = stratumAllThickness; // 所有的厚度data.push(item);}return data;
}
// 创建剖面图
const createSectDoc = async (sectData) => {// 获取要绘制的数据let drawData = sectData;// 获取最大和最小值let minX = Math.min(...drawData.map(d => d.x));let maxX = Math.max(...drawData.map(d => d.x));let minY = Math.min(...drawData.map(d => d.y));let maxY = Math.max(...drawData.map(d => d.y + d.stratumsThickness));minY = Math.floor(minY / 10) * 10; // 往10取整,刻度以10为单位maxY = Math.ceil(maxY / 10) * 10 + 10; // 往10取整,刻度以10为单位,稍长点let posMaxX = maxX - minX + 20; //x绘制位置,相对距离从标尺偏移十个像素let posMinX = 10;//x绘制位置,相对距离从标尺偏移十个像素const startPoint = tplInfo.startLine.positon;let doc = new vjmap.DbDocument();// 数据来源doc.from = `${templateSectId}/${templateSecVersion}`;// 把来源图的数据最后都清空,(这里的模板不需要清空,直接用了)// doc.isClearFromDb = true;let entitys = [];// 左边刻度entitys.push(new vjmap.DbLine({objectid: "169A2",start: startPoint,end: [startPoint[0], startPoint[1] + (maxY - minY)]}))for(let y = minY; y < maxY; y += 10) {let pt = [startPoint[0], startPoint[1] + maxY - y];entitys.push(new vjmap.DbLine({start: pt,end: [pt[0] - 2, pt[1]]}))// 刻度值entitys.push(new vjmap.DbText({cloneObjectId: '168C8',position: [pt[0] - 1, pt[1] + 0.2],text: y + ''}))}// 右边刻度entitys.push(new vjmap.DbLine({cloneObjectId: "169A2", // 不是修改了,是克隆左边的刻度线start: [startPoint[0] + posMaxX, startPoint[1]],end: [startPoint[0] + posMaxX, startPoint[1] + (maxY - minY)]}))for(let y = minY; y < maxY; y += 10) {let pt = [startPoint[0], startPoint[1] + maxY - y];entitys.push(new vjmap.DbLine({start: [pt[0] + posMaxX , pt[1]],end: [pt[0]  + posMaxX + 2, pt[1]]}))// 刻度值entitys.push(new vjmap.DbText({cloneObjectId: '168C8',position: [pt[0] + posMaxX + 1, pt[1] + 0.2],text: y + ''}))}// 修改线坐标entitys.push(new vjmap.DbLine({cloneObjectId:  tplInfo.startLine.objectId,start: [startPoint[0], startPoint[1]],end: [startPoint[0] + posMaxX, startPoint[1]]}))// 演示下块及属性字段的使用,这里用块创建一个孔口名称和x坐标,中间用横线隔开const blockName = "nameAndx";let block = new vjmap.DbBlock();block.name = blockName;block.origin = [0, 0]block.entitys = [new vjmap.DbAttributeDefinition({position: [0, 0.2],contents: "名称",tag: "NAME",colorIndex: 7, // 自动反色horizontalMode: vjmap.DbTextHorzMode.kTextCenter,verticalMode: vjmap.DbTextVertMode.kTextBottom, // kTextBottom,height: 0.5,}),new vjmap.DbLine({start: [-2, 0],end: [2, 0]}),new vjmap.DbAttributeDefinition({position: [0, -0.2],contents: "X坐标",tag: "POSX",colorIndex: 7, // 自动反色horizontalMode: vjmap.DbTextHorzMode.kTextCenter,verticalMode: vjmap.DbTextVertMode.kTextTop, // kTextBottom,height: 0.5,})];doc.appendBlock(block);// 绘制每一个孔for(let i = 0; i < drawData.length; i++) {// 开始绘制的位置点let x = posMinX + drawData[i].x - minX;let y = startPoint[1] + maxY - drawData[i].y;// 名称和x,用上面的块创建块参照let blockRef = new vjmap.DbBlockReference();blockRef.blockname = blockName;blockRef.position =  [x + 1.5,  y + 3];// 修改属性定义值blockRef.attribute = {NAME: drawData[i].name,POSX: drawData[i].x}entitys.push(blockRef);// 一层一层绘制for(let k = 0; k < drawData[i].stratums.length; k++) {let y2 = y - drawData[i].stratums[k].thickness;let bounds = vjmap.GeoBounds.fromArray([x, y, x + 3, y2]);let points = bounds.toPointArray(); // 转成点坐标格式// 闭合points.push(points[0]);// 填充entitys.push(new vjmap.DbHatch({cloneObjectId: drawData[i].stratums[k].hatch.hatchObjectId,points: points,patternScale: 1.5}))// 边框entitys.push(new vjmap.Db2dPolyline({points: points}))// 绘制连接下一个孔的线if (i != drawData.length - 1) {const nextKongStratums = drawData[i + 1].stratums;let nextX = posMinX + drawData[i + 1].x - minX;let nextY = startPoint[1] + maxY - drawData[i + 1].y;if (k < nextKongStratums.length) {for(let n = 0; n <= k; n++) {nextY = nextY - drawData[i + 1].stratums[n].thickness;}entitys.push(new vjmap.DbLine({start: [x + 3, y2],end: [nextX, nextY]}))}// 水平间距entitys.push(new vjmap.DbLine({start: [x, startPoint[1]],end: [x, startPoint[1] - 2]}))entitys.push(new vjmap.DbLine({start: [nextX, startPoint[1]],end: [nextX, startPoint[1] - 2]}))entitys.push(new vjmap.DbLine({start: [x, startPoint[1] - 2],end: [nextX, startPoint[1] - 2]}))// 间距值entitys.push(new vjmap.DbText({cloneObjectId: '168C8',position: [(x + nextX) / 2, startPoint[1] - 1],text: nextX - x,horizontalMode: vjmap.DbTextHorzMode.kTextCenter, // kTextCenterverticalMode: vjmap.DbTextVertMode.kTextVertMid // kTextVertMid,}))}y = y2;}// 最下面写上累计厚度值entitys.push(new vjmap.DbText({cloneObjectId: '168C8',position: [x + 1.5, y - 0.2],text: drawData[i].stratumsThickness,horizontalMode: vjmap.DbTextHorzMode.kTextCenter, // kTextCenterverticalMode: vjmap.DbTextVertMode.kTextTop // kTextTop,}))}entitys.push(new vjmap.DbText({objectid: '1687C',position: [(posMinX + posMaxX) / 2.0, startPoint[1] + maxY - minY + 10],/* 如果是相对位置,可以利用矩阵matrix: [{op: "translation",vector: [相对偏移x, 相对偏移y]}],*/text: `剖面图${Date.now()}`}))// 绘制图框let bounds = vjmap.GeoBounds.fromArray([posMinX - 20, startPoint[1] + maxY - minY + 15, posMaxX + 10, startPoint[1] - 20]);let labelPos = [bounds.max.x, bounds.min.y];let points = bounds.toPointArray(); // 转成点坐标格式// 闭合points.push(points[0]);// 边框entitys.push(new vjmap.Db2dPolyline({points: points}))bounds = bounds.scale(1.02);points = bounds.toPointArray(); // 转成点坐标格式// 闭合points.push(points[0]);// 边框entitys.push(new vjmap.Db2dPolyline({points: points,lineWidth: 30 // mm}))let date = new Date();// 图框从其他模板插入,并修改块属性文字entitys.push(new vjmap.DbBlockReference({cloneObjectId: '6A1',cloneFromDb: `${templateTkMapId}/${templateTkVersion}`,position: labelPos,attribute: {// 修改块中的属性字段DATETIME: `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`,COMPANY: {text: "唯杰地图VJMAP",color: 0x00FFFF}}}))entitys.push(new vjmap.DbLine({objectid: "168C8", // 这个模板文字不用了,直接删除了delete: true}))doc.entitys = entitys;return doc;
}// 先得设置一个要图形的所有范围,这个范围是随便都没有有关系的。最后导出dwg时,会根据实体的所有坐标去自动计算真实的范围。
let mapBounds = '[-10000,-10000,10000,10000]'
let mapExtent = vjmap.GeoBounds.fromString(mapBounds);
mapExtent = mapExtent.square(); // 要转成正方形svc.setCurrentMapParam({darkMode: true, // 由于没有打开过图,所以主动设置黑色模式bounds: mapExtent.toString()
})
// 建立坐标系
let prj = new vjmap.GeoProjection(mapExtent);// 新建地图对象
let map = new vjmap.Map({container: 'map', // container IDstyle: {version: svc.styleVersion(),glyphs: svc.glyphsUrl(),sources: {},layers: []},// 矢量瓦片样式center: [0,0], // 中心点zoom: 2,renderWorldCopies: false
});
// 地图关联服务对象和坐标系
map.attach(svc, prj);// 使地图全部可见
map.fitMapBounds();
await map.onLoad();// 创建一个几何对象
const createGeomData = async (map, doc) => {let svc = map.getService();let res = await svc.cmdCreateEntitiesGeomData({filedoc: doc.toDoc()});if (res.error) {message.error(res.error);return {type: "FeatureCollection",features: []};}if (res.metadata && res.metadata.mapBounds) {// 如果返回的元数据里面有当前地图的范围,则更新当前地图的坐标范围map.updateMapExtent(res.metadata.mapBounds);}const features = [];if (res && res.result && res.result.length > 0) {for (let ent of res.result) {if (ent.geom && ent.geom.geometries) {let clr = map.entColorToHtmlColor(ent.color); // 实体颜色转html颜色let featureAttr = {};// 因为要组合成一个组合实体,所以线和多边形的颜色得区分if (ent.isPolygon) {featureAttr.color = clr; // 填充色,只对多边形有效featureAttr.noneOutline = true; // 不显示多边形边框,只对多边形有效} else {featureAttr.color = clr; // 颜色featureAttr.line_width = ent.lineWidth; // 线宽}let ft = {id: vjmap.RandomID(10),type: "Feature",properties: {objectid: ent.objectid,opacity: ent.alpha / 255,...featureAttr,}}if (ent.geom.geometries.length == 1) {features.push({...ft,geometry: ent.geom.geometries[0],});} else {features.push({...ft,geometry: {geometries: ent.geom.geometries,type: "GeometryCollection"},});}}}}return {type: "FeatureCollection",features: features,};
};// 清空之前的地图数据
const clearMapData = () => {svc.setCurrentMapParam({darkMode: true, // 由于没有打开过图,所以主动设置黑色模式bounds: mapExtent.toString()})map.disableLayerClickHighlight();map.removeDrawLayer();let sources = map.getStyle().sources;for(let source in sources) {map.removeSourceEx(source);}
}// 创建一个有数据的地图
const createDataMap = async (doc) => {clearMapData();let geojson = await createGeomData(map, doc);const opts = vjmap.Draw.defaultOptions();// 修改默认样式,把点的半径改成1,没有边框,默认为5let pointIdx = opts.styles.findIndex(s => s.id === "gl-draw-point-point-stroke-inactive");if (pointIdx >= 0) {opts.styles[pointIdx]['paint']['circle-radius'][3][3] = 0}pointIdx = opts.styles.findIndex(s => s.id === "gl-draw-point-inactive");if (pointIdx >= 0) {opts.styles[pointIdx]['paint']['circle-radius'][3][3] = 1}map.getDrawLayer(opts).set(geojson);
}// 创建一个dwg的地图
const createDwgMap = async (doc) => {// 先清空之前绘制的clearMapData();// js代码let res = await svc.updateMap({// 获取一个临时的图id(临时图形只会用临时查看,过期会自动删除)mapid: vjmap.getTempMapId(1), // 临时图形不浏览情况下过期自动删除时间,单位分钟。默认30filedoc: doc.toDoc(),mapopenway: vjmap.MapOpenWay.Memory,style: {backcolor: 0 // 如果div背景色是浅色,则设置为oxFFFFFF}})if (res.error) {message.error(res.error)}await map.switchMap(res);
}let curDoc;
const exportDwgOpen = async () => {if (!curDoc) return;const mapid = 'exportdwgmap';let res = await svc.updateMap({mapid: mapid,filedoc: curDoc.toDoc(),mapopenway: vjmap.MapOpenWay.Memory,style: {backcolor: 0 // 如果div背景色是浅色,则设置为oxFFFFFF}})if (res.error) {message.error(res.error)} else{window.open(`https://vjmap.com/app/cloud/#/map/${res.mapid}?version=${res.version}&mapopenway=Memory&vector=false`)}
}// 获取模板的所有数据
const getTemplateData = async (mapid, version) => {let res = await svc.rectQueryFeature({mapid,version,fields: "",geom: false, // 以内存方式打开,获取真正的objectidmaxGeomBytesSize: 0, // 不需要几何坐标useCache: true, // 因为是以内存方式打开,后台先把查询的数据保存进缓存,下次直接去缓存查找,提高效率// x1,y1,x2,y2同时不输的话,表示是查询整个图的范围  这范围不输入,表示是全图范围})// 把实体的范围字符串转成对象res.result.map(f => f.envelop = vjmap.GeoBounds.fromString(f.bounds));console.log(res.result)return res.result;
}const creatSectDataMap = async () => {let sectData = mockData(tplInfo.hatchInfos, 5);const doc = await createSectDoc(sectData);await createDataMap(doc);map.fitMapBounds();curDoc = doc;
}
const creatSectDwgMap = async () => {let sectData = mockData(tplInfo.hatchInfos, 15);const doc = await createSectDoc(sectData);await createDwgMap(doc);map.fitMapBounds();// 点击有高亮状态(鼠标点击地图元素上时,会高亮)map.enableLayerClickHighlight(svc, e => {if (!e) return;let msg = {content: `type: ${e.name}, id: ${e.objectid}, layer: ${e.layerindex}`,key: "layerclick",duration: 5}e && message.info(msg);})curDoc = doc;
}
// 先获取模板信息
tplInfo = await getTemplateInfo(templateSectId, templateSecVersion);
// 随机生成一个剖面图
creatSectDataMap();
// UI界面
const App = () => {return (<div><div className="info" style={{width: '430px'}}><div className="input-item"><button className="btn btn-full mr0" onClick={creatSectDataMap}>随机生成一个剖面图[前端直接绘制,适合于生成图不大的情况]</button><button className="btn btn-full mr0" onClick={creatSectDwgMap}>随机生成剖面图[后台生成DWG前端展示,适合于生成图大的情况]</button><button className="btn btn-full mr0" onClick={exportDwgOpen}>导出成DWG图并打开</button></div></div></div>);
}
ReactDOM.render(<App />, document.getElementById('ui'));const mousePositionControl = new vjmap.MousePositionControl();
map.addControl(mousePositionControl, "bottom-left");

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SolidWorks+thonny esp32 电磁控制,程序算法搞起来了,我的结构-仿真-电磁-控制-算法的学习之路

来个自我介绍&#xff0c;本科是微电子制造专业&#xff0c;隶属于机电工程学院&#xff0c;所以机械&#xff0c;电子&#xff0c;控制&#xff0c;流体&#xff0c;材料&#xff0c;结构这些基础都有&#xff0c;而且水平不低。工作了13年&#xff0c;主要干机械&#xff0c;…

有趣的技术探索分享小合集

Chatgpt 现世仅两个月&#xff0c;已经达到了 1 亿月活跃用户&#xff0c;不但影响了世界范围内的知识工作者&#xff0c;还在各行各业掀起了科技创新的热潮。在信息大爆炸、新科技不断涌出的现阶段&#xff0c;拥有面向未来的科技趋势的重要的洞察力&#xff0c;并由此改变所处…

chatgpt赋能python:Python画圆柱体教程:从入门到实践

Python画圆柱体教程&#xff1a;从入门到实践 如果你正在寻找一种简单有效的Python绘图方法&#xff0c;那么画圆柱体是一个不错的选择。本文将介绍如何使用Python绘制圆柱体的过程&#xff0c;包括使用的库、代码示例以及最终结果。 介绍 圆柱体是一种很常见的几何形状&…

Altium Designer导入AutoCAD图纸

简介&#xff1a;本文主要介绍的是将Altium Designer导入AutoCAD图纸的操作方法。 一直采用Altium Designer绘制PCB边框&#xff0c;可是如果PCB的尺寸边框十分复杂&#xff0c;或者遇到Altium Designer无法设计的图形&#xff0c;比如椭圆的时候&#xff0c;我们不得不借助第三…

谷歌一雪前耻,全新PaLM 2反超GPT-4,办公全家桶炸裂升级,Bard史诗进化

【新智元导读】新版PaLM 2超强进化&#xff0c;办公全家桶Workspace全面升级&#xff0c;Bard全面增强、所有人可用……可以看出&#xff0c;这届I/O大会&#xff0c;谷歌是真的憋出不少大招。 谷歌I/O 2023大会&#xff0c;仿佛又给谷歌的支持者们打了一针强心剂。 此前&…

阿里巴巴取消 CTO 一职;近半数微软员工担心被 AI 抢饭碗;Flutter 3.10 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

Apple I 设计完成 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 11 日&#xff0c;在 1953 年的今天&#xff0c;安德鲁怀尔斯诞生。大约在 1637 年左右&#xff0c;法国学者费马提出了一个数学代数相关的定理&#xff0…

不跟风 ChatGPT,Google AI 2022 年都在忙什么?

作者 | Marian Croak 翻译&整理 | Carol 出品 | AI科技大本营 谷歌发布了2022年在AI领域取得的巨大突破&#xff0c;主要包括大语言模型 (LLM) 和文本生图两个领域。 相较多年前提出的“不作恶”口号&#xff0c;谷歌将今后发展人工智能的理念进一步提升至“负责任”…

Python基础语法 常见面试问题 技巧汇总

Python基础语法 & 常见面试问题 & 技巧汇总 文章目录 Python基础语法 & 常见面试问题 & 技巧汇总一、注释二、变量与常量三、输出1、格式化输出1&#xff09;"~{}".format(a)2&#xff09;%s,%.1f 2、转义字符 四、运算符1、幂运算 五、基本数据类型…

LeetCode刷题——贪心法(C/C++)

这里写目录标题 [中等]买卖股票的最佳时机 II[中等]移掉k位数字[中等]跳跃游戏[中等]跳跃游戏 II[中等]加油站[中等]划分字母区间[中等]去除重复字母[中等]无重叠区间[中等]用最少数量的箭引爆气球 [中等]买卖股票的最佳时机 II 原题链接题解 最简单的思路&#xff0c;效率不高…

云炬VB开发笔记 2可视化编程基础

源码下载&#xff08;提取码:6666&#xff09; 目录 1模拟小车行驶—— 控件基本属性和窗体​ 2-2简易文本编辑器—— 标签、 命令按钮、文本框​​​ 2-3模拟热气球 升空—— 图片和图像框​ 1模拟小车行驶—— 控件基本属性和窗体 2-2简易文本编辑器—— 标签、 命令按钮…

如何为现有IntelliJ IDEA项目创建GitHub存储库和本地Git存储库

IntelliJ IDEA是Java语言开发的集成环境&#xff0c;IntelliJ在业界被公认为优秀的Java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。 点击下载IntelliJ IDEA最新试…

代码创造的欢乐世界-通用人工智能让儿童熟练应用编程

想要复杂的参考这一篇&#xff0c;使用云平台即可完成&#xff1a; 美美的圣诞树画出来-CoCube- 把圣诞树换成六一儿童节主题的就可以啦。 这一篇是使用chatgpt类应用&#xff0c;给出关键提示词&#xff0c;代码自动生成哦。 神十六发射成功&#xff0c;科技工作者博士学位…

统计检验分析 (本文在chatGPT辅助下完成)

1. 正态分布检验 2. 统计检验 t-test: 适用于样本数量较小&#xff08;通常小于 30&#xff09;的正态分布数据&#xff0c;用于比较两个样本的均值是否有显著差异。 Paired t-test: 确定某个总体的成对测量值之间的差异是否为 0 Two-sample t-test (independent t-test): 确…

sql 性能优化基于explain调优

文章目录 Explain分析&#xff1f;问题描述解决方案 Explain分析&#xff1f; 关于Explain具体可以干什么&#xff0c;有哪些优缺点&#xff0c;本博主的文章有写到&#xff0c;这是链接地址: 点击这里查看. 下面来说下Explain在项目实战中&#xff0c;如何去进行优化。 问题…

chatgpt在Unity里的开发和原理

chatgpt在Unity里的开发和原理 教学视频 先放上教学视频链接 https://www.reddit.com/r/unity_tutorials/comments/10aic34/chatgpt_with_unity_in_todays_video_i_show_you_a/ https://www.youtube.com/watch?vPRwfHajinSU 语音控制实现unity里的效果 或者语音控制实现Un…

搞不定高考的ChatGPT,原来只有小学4年级水平

夕小瑶科技说 原创 作者 | Python 之前&#xff0c;复旦大学的研究者让ChatGPT参加了中国高考&#xff0c;发现成绩惨不忍睹&#xff08;参见推送&#xff09;&#xff0c;其中理科数学竟只有20多分。这次&#xff0c;小米AI lab的研究者们给模型降低一下难度&#xff0c;找了…

《聊聊我的故事 | 谈谈自己大学的收获,以及毕业的求职经历》

1.初进校园&#xff0c;实现最初的梦想 还在读高中的时候&#xff0c;心中就非常向往大学的生活&#xff0c;希望自己可以快一点进入大学。记得老师经常对我们说&#xff0c;你们现在辛苦一点&#xff0c;等到进入大学后就会轻松很多了。因此&#xff0c;心中便一直都有一个目…

毕业后的感言

我们毕业了&#xff0c;毕业季分手季。我目睹了那些不舍得眼泪。其实在那个时候我发觉嘴上说自己是一个没心没肺的人是不现实的。我居然也被赤化了。我居然也有心酸&#xff0c;也会难过。甚至对自己的前女友说有点不舍。毕业后祝你幸福! 回首大学&#xff0c;我没有遗憾&#…

毕业季心得

活动地址&#xff1a;毕业季进击的技术er &#x1f449;目录 前言学习背景敲下的第一行代码对未来的规划想对大家说的话最后 前言 时光荏苒&#xff0c;转瞬即逝&#xff0c;如白驹过隙一般。在这炎炎盛夏&#xff0c;我们又迎来了毕业季&#xff0c;我是一名在校生&#xff0c…