def projectdetaillinesF(sporigin, sptriangle, xpart, uvtranslistCcolumns, uspacing, vspacing, battendetaillines): cc = findcctriangleinmesh(sptriangle, xpart, uvtranslistCcolumns) if cc is None: return [] if abs(cc["cpt"][0] - sptriangle.u) > uspacing or abs(cc["cpt"][1] - sptriangle.v) > vspacing: return [] vc = sporigin - cc["cpt"] vcp = cc["urvec"] * vc.u + cc["vrvec"] * vc.v vcs = cc["vj"] * vcp.u + cc["vj1"] * vcp.v # should be same as vc vcsT = cc["vjT"] * vcp.u + cc["vj1T"] * vcp.v # use the 6mm expansion on either side of this line to our advantage ccLeft = findcctriangleinmesh(sptriangle - P2(5, 0), xpart, uvtranslistCcolumns) ccRight = findcctriangleinmesh(sptriangle + P2(5, 0), xpart, uvtranslistCcolumns) assert ccLeft != None and ccRight != None, (ccLeft, ccRight) trailingedgevecL = P2.ZNorm(ccLeft["vjT"] * ccLeft["urvec"].u + ccLeft["vj1T"] * ccLeft["urvec"].v) trailingedgevecR = P2.ZNorm(ccRight["vjT"] * ccRight["urvec"].u + ccRight["vj1T"] * ccRight["urvec"].v) #trailingedgevec = P2.ZNorm(cc["vjT"]*cc["urvec"].u + cc["vj1T"]*cc["urvec"].v) trailingedgevec = P2.ZNorm(trailingedgevecL + trailingedgevecR) #print("trailingedge angles ", trailingedgevecL.Arg(), trailingedgevecR.Arg()) trailingedgevecPerp = P2.ZNorm(cc["vjT"] * cc["vrvec"].u + cc["vj1T"] * cc["vrvec"].v) #trailingedgevec = P2.CPerp(trailingedgevecPerp) battendetails = [] for lsp in battendetaillines: battendetails.append(vcsT + cc["cptT"] + trailingedgevec * lsp.u + trailingedgevecPerp * lsp.v) return battendetails
def applyconsistenrotationtoflats(surfacemesh): ptsF = surfacemesh["fpts"] * ( 1, -1) # reflect in Y using numpy.array multiplication offsetloopuv = surfacemesh["offsetloopuv"] offsetloopptsF = [ P2(ptsF[i][0], ptsF[i][1]) for i in surfacemesh["offsetloopI"] ] offsetloopuvCentre = sum(offsetloopuv, start=P2( 0, 0)) * (1.0 / len(offsetloopuv)) offsetloopptsFCentre = sum(offsetloopptsF, start=P2( 0, 0)) * (1.0 / len(offsetloopptsF)) voff = offsetloopuvCentre - offsetloopptsFCentre # this proves all the polygons are reflected orientOrg = orientation(surfacemesh["uvpts"], surfacemesh["offsetloopI"]) orientReflFlatttened = orientation(ptsF, surfacemesh["offsetloopI"]) assert orientOrg == orientReflFlatttened # try and rotate so we align with the first edge i0 = surfacemesh["offsetloopI"][-10] i1 = surfacemesh["offsetloopI"][-5] if surfacemesh["patchname"] == "US2": i0 = surfacemesh["offsetloopI"][10] i1 = surfacemesh["offsetloopI"][15] if surfacemesh["patchname"] == "TSR": i0 = surfacemesh["offsetloopI"][150] i1 = surfacemesh["offsetloopI"][155] #v = P2(*surfacemesh["uvpts"][i1]) - offsetloopuvCentre #vF = P2(*ptsF[i1]) - offsetloopptsFCentre v = P2(*surfacemesh["uvpts"][i1]) - P2(*surfacemesh["uvpts"][i0]) vF = P2(*ptsF[i1]) - P2(*ptsF[i0]) xv = P2.ZNorm(P2(P2.Dot(vF, v), P2.Dot(P2.APerp(vF), v))) yv = P2.APerp(xv) explodev = (offsetloopuvCentre - P2(3, 0)) * 0.8 if surfacemesh["patchname"] == "TSM3": offsetloopuvCentre -= P2(1.0, -0.3) def transF(p): p0 = p - offsetloopptsFCentre return xv * p0[0] + yv * p0[1] + offsetloopuvCentre + explodev surfacemesh["fptsT"] = fptsT = numpy.array([transF(p) for p in ptsF]) vFT = P2(*surfacemesh["fptsT"][i1]) - P2(*surfacemesh["fptsT"][i0]) #print(v.Arg(), vF.Arg(), vFT.Arg()) surfacemesh["textpos"] = offsetloopuvCentre + explodev