MATLAB-CATIA导入多段直线段

2022年“盈建科杯”中,需要使用不同的参数生成不同的结构,再导入Midas Civil进行受力分析。由于构件全为直杆,不需要将点阵拟合成样条曲线。提供一种方法:在MATLAB中进行结构设计(方便修改不同的参数),再使用CATIA自带的文件“GSD_PointSplineLoftFromExcel.xls”导入直线段。

示例:
main.m

clear;clc;
%initialize
heigh = [350,350,200];
outdiameter = [350,320,290];
indiameter = [220,190,180];

%% solve geometic

%circle
figure(3)
x = -0.5*indiameter(1):0.01:0.5*indiameter(1);
yptv = sqrt((0.5*indiameter(1))^2-x.^2);
yntv = -sqrt((0.5*indiameter(1))^2-x.^2);
plot(x,yptv)  %%
axis equal
%eight pol
hold on %%
tempa = outdiameter(1)/(1+sqrt(2));
Pts = [tempa/2,tempa*(sqrt(2)+1)/2;
    tempa*(sqrt(2)+1)/2,tempa/2;
    tempa*(sqrt(2)+1)/2,-tempa/2;
    tempa/2,-tempa*(sqrt(2)+1)/2;
    -tempa/2,-tempa*(sqrt(2)+1)/2;
     -tempa*(sqrt(2)+1)/2,-tempa/2;
      -tempa*(sqrt(2)+1)/2,tempa/2;
      -tempa/2,tempa*(sqrt(2)+1)/2;];
scatter(Pts(:,1),Pts(:,2)) %%
% qiedian
qiedian = findqiedian(Pts(8,:),1,indiameter(1),1); % jiaodianzuobiao shangxiabanyuan banjing zuoyouqiedian 
diandata = [Pts(8,:),0,qiedian,0];
scatter(qiedian(1),qiedian(2)) %%

%% get direction vector
C = getrotatemetrix(diandata);
Long = sqrt(sum((diandata(1:3)-diandata(4:6)).^2));
changepos = [90,90,90];
diwidth = Long;%dimiandechangdu
foldtimes = [3,3,3];% zhediedecishu 
connectdir = [1,1,1]; %1 is out to in -1 is in to out

%start
fixedpoint = [0,0,0;
    diwidth,0,0;
    diwidth,0,heigh(1);
    
    indiameter(1)-indiameter(2),0,heigh(1);
    diwidth+indiameter(1)-indiameter(2),0,heigh(1);
    diwidth+indiameter(1)-indiameter(2),0,heigh(1)+heigh(2);

    indiameter(1)-indiameter(3),0,heigh(1)+heigh(2);
    diwidth+indiameter(1)-indiameter(3),0,heigh(1)+heigh(2);
    diwidth+indiameter(1)-indiameter(3),0,heigh(1)+heigh(2)+heigh(3);
    
    0,0,heigh(1);
    0,0,heigh(1)+heigh(2);
    0,0,heigh(1)+heigh(2)+heigh(3)];
figure(1)
plot3(fixedpoint(:,1),fixedpoint(:,2),fixedpoint(:,3));
xlabel("X")
ylabel("Y")
zlabel("Z")
axis equal 
Line = [];
Line(end+1,:) = [fixedpoint(1,:),fixedpoint(2,:)];
Line(end+1,:) = [fixedpoint(2,:),fixedpoint(3,:)];
Line(end+1,:) = [fixedpoint(10,:),fixedpoint(5,:)];
Line(end+1,:) = [fixedpoint(1,:),fixedpoint(10,:)];

Line(end+1,:) = [fixedpoint(4,:),fixedpoint(4,1),0,heigh(1)+heigh(2)];
Line(end+1,:) = [fixedpoint(5,:),fixedpoint(6,:)];
Line(end+1,:) = [fixedpoint(4,1),0,heigh(1)+heigh(2),fixedpoint(8,:)];

Line(end+1,:) = [fixedpoint(8,:),fixedpoint(9,:)];
Line(end+1,:) = [fixedpoint(7,:),fixedpoint(7,1),0,heigh(1)+heigh(2)+heigh(3)];
Line(end+1,:) = [fixedpoint(7,1),0,heigh(1)+heigh(2)+heigh(3),fixedpoint(9,:)];

%midden
for i = 1:3
    if connectdir(i) == 1
    if i == 1
        temp = 0;
    else
        temp = heigh(i-1)+temp;
    end
    temppointout = [repmat(fixedpoint(1+3*(i-1),1),foldtimes(i),1),zeros(foldtimes(i),1),(temp+cumsum(heigh(i)/(foldtimes(i)).*ones(1,foldtimes(i))))'];
    tempa = (temppointout(foldtimes(i),3)-temppointout(foldtimes(i)-1,3))/2;
    temppointin = [repmat(fixedpoint(2+3*(i-1),1),foldtimes(i),1),zeros(foldtimes(i),1),temppointout(:,3)-tempa];
    end
    temppointout = [temppointout(1,:);temppointout];
    temppointout(1,3) = temppointout(1,3)-temppointout(end,3)+temppointout(end-1,3);
    for j = 1:foldtimes(i)
        Line(end+1,:) = [temppointin(j,:),temppointout(j,:)];
        Line(end+1,:) = [temppointin(j,:),temppointout(j+1,:)];
    end
end
figure(2)
hold on
for i = 1:size(Line,1)

    X = [Line(i,1);Line(i,4)];
%     Y = [Line(i,2);Line(i,5)];
    Z = [Line(i,3);Line(i,6)];
    plot(X,Z)
end
axis equal





testLine = Line(:,1:3);
testLine = testLine';
testLineTrans1 = inv(C)*testLine;
testLineTrans1 = testLineTrans1';

testLine = Line(:,4:6);
testLine = testLine';
testLineTrans2 = inv(C)*testLine;
testLineTrans2 = testLineTrans2';

testLineTrans = [testLineTrans1,testLineTrans2];


figure(4)
hold on
for i = 1:size(testLineTrans,1)

    X = [testLineTrans(i,1);testLineTrans(i,4)];
    Y = [testLineTrans(i,2);testLineTrans(i,5)];
    Z = [testLineTrans(i,3);testLineTrans(i,6)];
    plot3(X,Y,Z);

end
xlabel("X")
ylabel("Y")
zlabel("Z")
axis equal


testLineTrans11 = testLineTrans1+Long.*C(:,2)';
testLineTrans22 = testLineTrans2+Long.*C(:,2)';
testLineTrans = [testLineTrans11,testLineTrans22];

figure(5)
hold on
for i = 1:size(testLineTrans,1)

    X = [testLineTrans(i,1);testLineTrans(i,4)];
    Y = [testLineTrans(i,2);testLineTrans(i,5)];
    Z = [testLineTrans(i,3);testLineTrans(i,6)];
    plot3(X,Y,Z);

end
xlabel("X")
ylabel("Y")
zlabel("Z")
axis equal

Line = [Line;testLineTrans];

%% excel
writematrix('StartLoft','GSD.xlsx')
for i = 1:size(Line,1)
    str = ['A',num2str(4*(i-1)+2)];
    writematrix('StartCurve','GSD.xlsx',Range=str)
    str = ['A',num2str(4*(i-1)+3) ':' 'C',num2str(4*(i-1)+4)];
    writematrix(reshape(Line(i,:),3,2)','GSD.xlsx',Range=str);
    str = ['A',num2str(4*(i-1)+5)];
    writematrix('EndCurve','GSD.xlsx',Range=str);
end
str = ['A',num2str(4*(size(Line,1)-1)+6)];
writematrix('EndLoft','GSD.xlsx',Range=str);
str = ['A',num2str(4*(size(Line,1)-1)+7)];
writematrix('End','GSD.xlsx',Range=str);

findqiedian.m

function qiedian = findqiedian(jiaodian,shangxia,diameter,zuoyou)
% jiaodian ---- dingdian
% shangxia ---- 1:shang 2:xia 3:zhong
% diameter ---- banjing
% zouyou   ---- 1:zuo 2:you
syms x0
if shangxia == 1
    y0 = sqrt((0.5*diameter)^2-x0.^2);
    x = solve(jiaodian(2)-y0==-x0/y0*(jiaodian(1)-x0));
    x = double(x);
    x = x(zuoyou);
    qiedian = [x,sqrt((0.5*diameter)^2-x.^2)];
elseif shangxai == 2
    y0 = -sqrt((0.5*diameter(1))^2-x0.^2);
    x = solve(jiaodian(2)-y0==-x0/y0*(jiaodian(1)-x0));
    x = double(x);
    x = x(zuoyou);
    qiedian = [x,-sqrt((0.5*diameter)^2-x.^2)];
elseif shangxia == 3
    if jiaodian(2) > 0
        qiedian = [0,0.5*diameter];
    else
        qiedian = [0,-0.5*diameter];
    end
end

getrotatemetrix.m

function C = getrotatemetrix(diandata)
vecter1 = [0,0,1];
vecter2 = [diandata(4)-diandata(1),diandata(5)-diandata(2),diandata(6)-diandata(3)];
vecter2 = vecter2./sqrt(sum(vecter2.^2));
% satisfy the right hand rule's vector3
A = [vecter1(1:2);vecter2(1:2)];
B = -null(A);
vecter3 = [B',0];
eta = [vecter3',vecter2',vecter1'];
ksi = eye(3);
C = eta\ksi;

请添加图片描述
请添加图片描述
其中,可以将母体进行旋转和平移操作(使用坐标转换公式),从而设计不同的结构。

【注】:要将MATLAB生成的"GSD.xlsx"复制进 “GSD_PointSplineLoftFromExcel.xls”,才可使用宏。
【思考】:怎样让MATLAB在生成Excel时可以在里面附带宏?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值