用Matlab来将分层制造过程中G代码所表示的单层的加工路径显示出来

为了使数据变得更加直观,通常要用到可视化技术。这里从先从G代码中分离出坐标,然后根据G1代码的含义(直线插补),采用line命令来作出路径图。

原始数据如下(保存为test.txt):

G1 X-57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-30.24 Z1.18 F960.0
G1 X-57.636 Y-30.24 Z1.18 F960.0
M103
G1 X-57.636 Y1.44 Z1.18 F960.0
M101
G1 X57.636 Y1.44 Z1.18 F960.0
G1 X57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y30.24 Z1.18 F960.0
G1 X57.636 Y30.24 Z1.18 F960.0

M103



处理:

clc
clear all
close all

fid=fopen('test.txt'); 

n=89;%the number of line to read

for i=1:n
    a{i}=fgets(fid);
end 
fclose(fid); 

b(1,:)=zeros(1,3);
bi=2;
air=[];

for i=1:n
    lineCharacter=length(a{i});
    count=0;
    if(a{i}(1)=='G'&&a{i}(2)=='1')
        for k=3:lineCharacter
            if(isspace(a{i}(k)))
                count=count+1;
            end
            if(a{i}(k)=='X')
                kTemp=k+1;
                for kTempC=1:3
                    str=[];
                    while(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
                        str=strcat(str,a{i}(kTemp));
                        kTemp=kTemp+1;
                    end
                    while ~(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
                        kTemp=kTemp+1;
                    end
                    b(bi,kTempC)=str2num(str); 
                end
                bi=bi+1;
            end
        end
    end
    if(i~=(n-2)&&i~=(n-1)&&i~=n&&(strncmp(a{i},'M103',4)||strncmp(a{i+2},'M101',4)))
        air=[air,bi];
    end
end

figure;
hold on;
axis([min(b(:,1))-1,max(b(:,1))+1,min(b(:,2))-1,max(b(:,2))+1]);

for i=2:size(b,1)
%     if(b(i,3)==b(1,3))
        if(~ismember(i,air))
            line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',1,'Color','b');
        else
            line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',4,'Color','r');
        end
%     end
end

结果:


代码解释:

M103表示extruder off,刀具不进行加工操作;

M101表示进行加工操作。

所以,在这两个代码之间的G01表示的是空程路径。在这里用红色表示。

蓝色则表示刀具进行加工操作的路径。

air这个变量是用来记录空程的,直接标记空程终点所在坐标即可,作图时也只是变一下颜色就搞定。这个处理得很简洁。


技术点:

  1. line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]),
  2. ismember(c,A,'rows')可以判断数组c是不是矩阵A中的一行
  3. 二维图形坐标轴范围在缺省状态下是根据数据的大小自动设置的,如欲改变,可利用axis(xmin xmax ymin ymax),函数来定义。
  4. line(X,Y,Z,'Color','r','LineWidth',4),注意与plot的控制方法不同。。。。有一些小问题和line的这个问题合在一起了,我找了半天才发现,十分无语。。。。


### 复合材料渐进损伤的MATLAB模拟与分析 #### 使用MATLAB进行复合材料渐进损伤模拟的关键要素 在处理复合材料的渐进损伤问题时,MATLAB提供了强大的数值计算能力和丰富的工具箱支持。为了实现这一目标,通常会采用有限元方法(FEM),并结合特定算法来追踪裂纹扩展路径以及评估不同阶段下的应力应变响应。 对于复合材料而言,其多层结构特性使得传统FEM难以直接适用,因此引入了基于分层理论或等效单层模型的方法来进行求解。此外,在MATLAB环境中还可以利用`Partial Differential Equation Toolbox`或其他第三方开发包如COMSOL LiveLink™ for MATLAB® 来辅助完成更加精细的操作[^1]。 下面给出一段简单的MATLAB代码片段用于展示如何设置基本框架: ```matlab % 定义几何参数和材料属性 L = 0.2; % 层板长度 (m) W = 0.1; % 层板宽度 (m) t = [0.005, 0.007]; % 各层厚度 (m) E1 = [140e9, 70e9]; % 经向弹性模量 (Pa) E2 = E1 / 10; % 纬向弹性模量 (Pa) G12 = sqrt(E1 .* E2);% 剪切模量 (Pa) nu12 = 0.25; % 泊松比 % 创建复合材料对象 compositeMaterial = createCompositeMaterial(L,W,t,E1,E2,G12,nu12); % 设置边界条件和载荷工况 boundaryConditions = setBoundaryCondition(compositeMaterial); loadCase = applyLoad(compositeMaterial,boundaryConditions); % 执行仿真计算 [sigma_x,sigma_y,...]=simulateDamageProgression(loadCase); function compositeMat=createCompositeMaterial(length,width,thicknesses,... elasticModulusX,elasticModulusY,shearModulusXY,PoissonRatioXY) % 实现创建复合材料的具体逻辑... end function bc=setBoundaryCondition(materialObj) % 设定边界条件的具体细节... end function load=applyLoad(materialObj,bc) % 应用外部负载的过程... end function varargout=simulateDamageProgression(loadCase) % 进行渐进损伤仿真的核心部分... end ``` 此段伪代码仅作为概念性的指导,并未提供完整的函数定义。实际项目中还需要考虑更多因素,比如温度效应、湿度影响等环境变量的影响,同时也需调用合适的数学模型来精确描述纤维基体间的相互作用机制。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值