CAD图纸打印自动排版
// TypeSet.cpp: implementation of the CTypeset class.
//
//
#include "stdafx.h"
#include "../INC/TypeSet.h"
//用法示例
void TestTypeset(HDC dc)
{
//声明一个板材对象
CTypeset typeset;
//设置板材对象大小
typeset.m_Desktop.m_dHeight=9999;
typeset.m_Desktop.m_dWidth=100;
//声明一个排样元素对象
CMaterial material;
//设置排样元素对象大小
material.SetSize(20,99);
//添加进入板材对象
typeset.Add(&material);
//继续添加
material.SetSize(99,80);
typeset.Add(&material);
material.SetSize(10,60);
typeset.Add(&material);
material.SetSize(50,20);
typeset.Add(&material);
//添加完毕,进行排样
typeset.Go();
//排样完毕,输出
list<CMaterial*>::iterator iter;
//画板材对象
::Rectangle(dc,typeset.m_Desktop.m_dX,typeset.m_Desktop.m_dY,
typeset.m_Desktop.m_dX+typeset.m_Desktop.m_dWidth,
typeset.m_Desktop.m_dY+typeset.m_Desktop.m_dHeight);
//画排样元素对象
for(iter=typeset.m_MaterialList.begin();iter!=typeset.m_MaterialList.end();iter++)
{
::Rectangle(dc,(*iter)->m_dX,(*iter)->m_dY,
(*iter)->m_dX+(*iter)->m_dWidth,
(*iter)->m_dY+(*iter)->m_dHeight);
}
}
//
// CMaterial Class
//
//
// Construction/Destruction
//
#define ZERO 0.00001
CMaterial::CMaterial()
{
m_dHeight=100;
m_dWidth=100;
m_dX=0;
m_dY=0;
m_bUsed=FALSE;
m_bSeletcted=FALSE;
m_bRotated=FALSE;
m_iIndex=0;
}
CMaterial::CMaterial(double dWidth,double dHeight)
{
SetSize(dWidth,dHeight);
m_dX=0;
m_dY=0;
m_bUsed=FALSE;
m_bSeletcted=FALSE;
m_bRotated=FALSE;
m_iIndex=0;
}
CMaterial::CMaterial(CMaterial *pMaterial)
{
m_dX=pMaterial->m_dX;
m_dY=pMaterial->m_dY;
m_dHeight=pMaterial->m_dHeight;
m_dWidth=pMaterial->m_dWidth;
m_bUsed=pMaterial->m_bUsed;
m_bSeletcted=pMaterial->m_bSeletcted;
m_bRotated=pMaterial->m_bRotated;
m_iIndex=pMaterial->m_iIndex;
}
void CMaterial::SetSize(double dWidth, double dHeight)
{
m_dHeight=dHeight;
m_dWidth=dWidth;
}
void CMaterial::Rotated()
{
m_bRotated=!m_bRotated;
double dA=m_dHeight;
m_dHeight=m_dWidth;
m_dWidth=dA;
}
CMaterial::~CMaterial()
{
}
//
// Construction/Destruction
//
CTypeset::CTypeset()
{
Clear();
}
CTypeset::~CTypeset()
{
Clear();
}
void CTypeset::Clear()
{
list<CMaterial*>::iterator iter;
for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)
{
delete (*iter);
}
m_MaterialList.clear();
m_iCurIndex=0;
}
void CTypeset::Add(CMaterial *pMaterial)
{
CMaterial *p=new CMaterial(pMaterial);
p->m_iIndex=m_iCurIndex;
m_MaterialList.insert(m_MaterialList.end(),p);
m_iCurIndex++;
}
void CTypeset::Sort()
{
list<CMaterial*> MaterialList;
list<CMaterial*>::iterator iter1,iter2,iter3;
bool bSourceInvert=false;
while (!m_MaterialList.empty())
{
double dMaxLen=0;
iter2=m_MaterialList.begin();
CMaterial *p=NULL;
iter1=m_MaterialList.end()--;
iter3=iter2;
while(iter2!=iter1)
{
if((*iter2)->m_dWidth>dMaxLen)
{
p=*iter2;
iter3=iter2;
dMaxLen=(*iter2)->m_dWidth;
bSourceInvert=false;
}
if((*iter2)->m_dHeight>dMaxLen)
{
p=*iter2;
iter3=iter2;
dMaxLen=(*iter2)->m_dHeight;
bSourceInvert=true;
}
iter2++;
}
if(p!=NULL)
{
if(bSourceInvert)
p->Rotated();
MaterialList.insert(MaterialList.end(),p);
m_MaterialList.erase(iter3);
}
}
m_MaterialList.clear();
for(iter1=MaterialList.begin();iter1!=MaterialList.end();iter1++)
{
m_MaterialList.insert(m_MaterialList.end(),(*iter1));
}
MaterialList.clear();
}
double CTypeset::Go()
{
double dRet=0;
list<CMaterial*> List;
list<CMaterial*>::iterator iter;
Sort();
Typeset(m_Desktop.m_dX,m_Desktop.m_dY,
m_Desktop.m_dWidth,m_Desktop.m_dHeight,&List);
m_MaterialList.clear();
for(iter=List.begin();iter!=List.end();iter++)
{
if((*iter)->m_dX<ZERO)
{
dRet+=(*iter)->m_dY;
}
(*iter)->m_bUsed=FALSE;
(*iter)->m_bSeletcted=FALSE;
m_MaterialList.insert(m_MaterialList.end(),(*iter));
}
List.clear();
return dRet;
}
double CTypeset::Typeset(double dStartX,double dStartY,double dStartHei,double dStartWid,
list<CMaterial*> *pList)
{
CMaterial *tmpunit=NULL;
list<CMaterial*>::iterator iter,iter1;
double dArea1,dArea2,dArea;//横放和竖放时的排样面积,和最后方案的排样面积
double dRestArea1,dRestArea2;//横放和竖放时排样后的剩余面积
list<CMaterial*> List1,List2;横放和竖放时的最佳排样序列
double dHeight,dWidth;
dHeight=dStartHei;
dWidth=dStartWid;
if(m_MaterialList.empty())
return 0;
for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)
{
if((*iter)->m_bUsed!=FALSE)
continue;
if((*iter)->m_dWidth<(*iter)->m_dHeight)
{
MessageBox(NULL,"错误","ERROR",MB_OK);
return 0;
}
//找出一张能放入的最大的没有排过的板材
//如果板材横竖都能放入
if(((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO))
&&((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO)))
{
if(dStartX<ZERO)
dWidth=(*iter)->m_dHeight;
(*iter)->SetUsed(TRUE);//对该图排样
//先横着放入继续排样,计算剩余面积
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1);
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率
//将刚才排过的板材状态还原,再竖直放入该图继续排样,计算剩余面积
if(dStartX<ZERO)
dWidth=(*iter)->m_dWidth;
SetStatus(&List1,FALSE);
tmpunit=(*iter)->Copy();
tmpunit->Rotated();
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率
}
else if((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO))//如果板材只能横着放入
{
if(dStartX<ZERO)
dWidth=(*iter)->m_dHeight;
(*iter)->SetUsed(TRUE);//对该图排样
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1);
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率
dRestArea2=dRestArea1+10;//不再尝试竖放,将竖放剩余面积设大
}
else if((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO))//如果板材只能竖着放入
{
if(dStartX<ZERO)
dWidth=(*iter)->m_dWidth;
(*iter)->SetUsed(TRUE);//对该图排样
tmpunit=(*iter)->Copy();
tmpunit->Rotated();
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率
dRestArea1=dRestArea2+10;//不再尝试横放,将横放剩余面积设大
}
else
continue;
//记录优化的排样序列
CMaterial *tmp=NULL;
if(dRestArea1<dRestArea2+ZERO)//当前板材横向排结果优化
{
SetStatus(&List2,FALSE);//将纵向排的排样序列还原状态
SetStatus(&List1,TRUE);//将横向排的排样序列标志为使用
dArea=dArea1+(*iter)->GetArea();;
tmp=(*iter)->Copy();
tmp->m_dX=(int)dStartX;
tmp->m_dY=(int)dStartY;
pList->insert(pList->end(),tmp);
while(!List1.empty())
{
iter1=List1.begin();
pList->insert(pList->end(),*iter1);
List1.erase(iter1);
}
//释放不好的序列
for(iter1=List2.begin();iter1!=List2.end();iter1++)
{
delete (*iter1);
}
List2.clear();
delete tmpunit;
}
else//当前板材纵向排结果优化
{
SetStatus(&List1,FALSE);//将横向排的排样序列还原状态
SetStatus(&List2,TRUE);//将纵向排的排样序列标志为使用
if(tmpunit==NULL)
{
MessageBox(NULL,"错误","ERROR",MB_OK);
return 0;
}
dArea=dArea2+(*iter)->GetArea();
tmp=tmpunit->Copy();
tmp->m_dX=(int)dStartX;
tmp->m_dY=(int)dStartY;
pList->insert(pList->end(),tmp);
while(!List2.empty())
{
iter1=List2.begin();
pList->insert(pList->end(),*iter1);
List2.erase(iter1);
}
//释放不好的序列
for(iter1=List1.begin();iter1!=List1.end();iter1++)
{
delete (*iter1);
}
List1.clear();
delete tmpunit;
}
double next_x,next_y,next_len,next_wid;
next_x=dStartX;
next_y=dStartY+tmp->m_dHeight;
next_len=dHeight;
next_wid=dStartWid-tmp->m_dHeight;
if(next_wid>ZERO)//板材还有剩余
{
//继续排下一行
dArea=dArea+Typeset(next_x,next_y,next_len,next_wid,&List1);
//记录排样序列
SetStatus(&List1,TRUE);
for(iter1=List1.begin();iter1!=List1.end();iter1++)
{
pList->insert(pList->end(),(*iter1));
}
List1.clear();
}
return dArea;
}
return 0;
}
void CMaterial::SetUsed(BOOL bUsed)
{
m_bUsed=bUsed;
}
void CTypeset::SetStatus(list<CMaterial*> *pList, BOOL bUsed)
{
list<CMaterial*>::iterator iter1,iter2;
for(iter1=m_MaterialList.begin();iter1!=m_MaterialList.end();iter1++)
{
for(iter2=pList->begin();iter2!=pList->end();iter2++)
{
if((*iter1)->m_iIndex==(*iter2)->m_iIndex)
{
(*iter1)->m_bUsed=bUsed;
}
}
}
}
CMaterial* CMaterial::Copy()
{
CMaterial* p=new CMaterial(this);
return p;
}
// TypeSet.h: interface for the CTypeset class.
//
//
#if !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)
#define AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma warning(disable:4786)
#pragma warning(disable:4251)
#include <list>
#include <string>
using namespace std;
#ifdef TYPESETLIB_EXPORTS
#define TYPESETLIB_API __declspec(dllexport)
#else
#define TYPESETLIB_API __declspec(dllimport)
#endif
TYPESETLIB_API void TestTypeset(HDC dc);
class TYPESETLIB_API CMaterial
{
public:
virtual CMaterial* Copy();
virtual void SetUsed(BOOL bUsed);
virtual void Rotated();
virtual void SetSize(double dWidth,double dHeight);
virtual double GetArea(){ return m_dHeight*m_dWidth; }
CMaterial();
CMaterial(CMaterial *pMaterial);
CMaterial(double dWidth,double dHeight);
virtual ~CMaterial();
double m_dHeight,m_dWidth;
double m_dX,m_dY;
BOOL m_bUsed;
BOOL m_bSeletcted;
BOOL m_bRotated;
int m_iIndex;
};
class TYPESETLIB_API CTypeset
{
public:
virtual double Go();
virtual void Add(CMaterial *pMaterial);
CTypeset();
virtual ~CTypeset();
list<CMaterial*> m_MaterialList;
CMaterial m_Desktop;
protected:
virtual void SetStatus(list<CMaterial*> *pList, BOOL bUsed);
virtual double Typeset(double dStatrX,double dStatrY,double dStatrHei,double dStatrWid,
list<CMaterial*> *pList);
virtual void Sort();
virtual void Clear();
int m_iCurIndex;
};
#endif // !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)
CAD图纸打印自动排版相关推荐
- CAD图纸打印文字显示空心怎么办?
CAD图纸打印文字显示空心怎么办?我们在CAD中输入文字打印出来的文字是空心该怎么办?如何打印出实心文字呢?下面来教你具体的操作方法. 1.首先我们运行CAD制图工具,然后在底部的命令栏输入" ...
- 如何将所需的CAD图纸打印出来?
如何将所需的CAD图纸打印出来?下面编辑今天分享快速CAD软件的简单使用,并打印了CAD图纸.演示如下: 1.打开我们的CAD图表读取软件,您可以在浏览器QuickCAD中搜索下载和安装.启动正在运行 ...
- CAD图纸打印时如何去掉图纸边框的白边?
CAD图纸打印时如何去掉图纸边框的白边?打印图纸,预览时发现图形四周有白边,该如何处理呢?其实我们只需要设置图纸边框就可以了,下面来教你具体的操作方法. 1.首先我们运行CAD制图工具,打开需要打印的 ...
- cad图纸打印出来更高效的方法介绍
CAD作为一款功能强大的绘图软件常被用于建筑工程.室内设计等领域中,我们经常会需要将CAD图纸打印出来,不仅为了方便分享和展示,也是工作推进的必要一步.下面就给大家推荐一个打印的方法,提高咱们的效率. ...
- CAD图纸打印时如何设置打印纸张的方向?
我们在日常的制图工作中,常常会需要打印CAD图纸.今天我就和大家分享一下,CAD图纸打印时设置打印纸张的方向的方法.非 常的简单 方便.演示操作如下: 1.先双击电脑桌面中的CAD软件图标,启动运行进 ...
- CAD图纸打印不出来
cad图纸打印不出来是怎么回事呢?cad图纸相信大家都很熟悉,但是cad图纸打印不出来是怎么回事呢,下面就让小编带大家一起了解吧. cad图纸打印不出来,其实就是cad图有些图层打印不出来,大家可能会 ...
- CAD图纸打印设置——使线条清晰有力
CAD图纸打印设置--使线条清晰有力(2步解决) 1 Ctrl+P进入打印设置 打开图纸后,Ctrl+P进入打印设置 2打印设置如下图 3预览一下
- CAD图纸打印,怎样设置打印呢?
很多小伙伴们都会在CAD制图过程中遇到各种不同的问题.其中就有,CAD图纸打印,怎样设置打印问题?今天我就和小伙伴们分享一下CAD图纸打印,怎样设置打印的具体操作方法.使用CAD看图软件进行CAD图纸 ...
- CAD中怎么设置线宽?CAD图纸打印出来线条太粗怎么办?
CAD图纸打印出来后线条太粗怎么办呢?怎么设置CAD线宽?在使用CAD软件绘制图纸的过程中,为了控制图纸打印出来后的线条宽度,会对CAD图纸中的线宽进行设置.那么如何进行CAD线宽设置呢?接下来的CA ...
- 2019有的图纸打印出来看不清楚_如何将CAD图纸打印出来?【AutoCAD教程】
点击蓝色字关注我哟 ☀每天推送CAD软件安装及下载.CAD工具应用.CAD技巧.CAD教程.CAD素材.CAD疑难问题解答等文章 ☀想认识志同道合的朋友一起学习CAD?请加入我们的QQ群 369845 ...
最新文章
- 使用python3 实现将网页或者文件导出至pdf 文件
- c# hdf5 写string_聊一聊C#8.0中的 await foreach
- window.opener.document.getElementById(“a”)用标准的Jquery 语言怎么写
- c hello world_世界上最难的 5 种编程语言!C/C++竟不在其列,它们到底是谁?
- UML学习笔记(4)——类图之间的关系
- 威海二职工业机器人专业_现在各大专开设的工业机器人专业前景如何?
- linux 命令行模式自动登录,实现linux的自动登录--命令行模式启动
- 深入理解 Java 内存模型(一)——基础
- app开发第二次总结
- 泛海精灵软件预发布统计报告 反馈
- mysql怎么避免联合查询_mysql-联合查询,连接查询
- od找数据 遇到dll_OriginPro:最近比较烦,被360盯上了【数据绘图】
- linux tcl是什么系统,基于Linux 及Tcl / Tk 的数控系统人机界面的实现
- 转移性乳腺癌的基因组图谱突出了突变和特征频率的变化
- 闭关修炼了5个月的源码,终于拿到蚂蚁金服Offer
- 转载]:[面试题:接口和抽象类的区别
- OpenCV中集成目标跟踪算法介绍
- 有监督学习与无监督学习
- Windows 7无法启用网络发现的处理办法
- 常见的tenor操作
热门文章
- 电机调速程序c语言,直流电机调速控制系统的C语言程序
- 单片机控制12864显示多行汉字(含PROTEUS仿真文件、程序和字模提取软件)
- 电子科技大学格拉斯哥学院英文教材使用效果
- 使用Poedit汉化wordpress主题
- freemarker 数组转字符串_freemarker中的split字符串分割
- iPadOS、iOS13降级iOS12.3.1方法
- python为什么被称为胶水语言_为什么只有python成了胶水语言?
- Oracle 执行计划详解(预估 + 真实)
- oracle的解释计划,oracle解释执行计划-Oracle
- 如何用Matlab修正异方差性,matlab 异方差 white