DIRECTORY AIS, BasicTime, Containers, SVCoordSys, Feedback, FS, Imager, ImagerColor, ImagerColorPrivate, ImagerInterpress, IO, SVMatrix3d, Menus, Real, Rope, SVShading, SV2d, SV3d, SVArtwork, SVArtworkUser, SVCaret, SVCoordSys2d, SVDraw, SVFiles, SVInterfaceTypes, SVMappings, SVModelTypes, SVSceneTypes, SVMatrix2d, SVSelections, SVViewerTools, ViewerClasses, ViewerTools, ViewerOps; SVArtworkUserImpl: CEDAR PROGRAM IMPORTS AIS, BasicTime, SVCoordSys, Feedback, FS, Imager, ImagerColor, ImagerColorPrivate, ImagerInterpress, IO, SVMatrix3d, Real, Rope, SVShading, SVArtwork, SVCaret, SVCoordSys2d, SVDraw, SVFiles, SVMappings, SVMatrix2d, SVSelections, SVViewerTools, ViewerOps, ViewerTools EXPORTS SVArtworkUser = BEGIN Artwork: TYPE = SVModelTypes.Artwork; Slice: TYPE = SVSceneTypes.Slice; SliceList: TYPE = SVSceneTypes.SliceList; Box: TYPE = SVModelTypes.Box; EditToolData: TYPE = SVInterfaceTypes.EditToolData; Matrix4by4: TYPE = SV3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Primitive: TYPE = SVSceneTypes.Primitive; Shape: TYPE = SVSceneTypes.Shape; Tube: TYPE = SVModelTypes.Tube; Vector3d: TYPE = SV3d.Vector3d; Viewer: TYPE = ViewerClasses.Viewer; SVData: TYPE = SVInterfaceTypes.SVData; ArtworkToolData: TYPE = SVInterfaceTypes.ArtworkToolData; UpdateHeader: PUBLIC PROC [assemblyName: Rope.ROPE, sceneName: Rope.ROPE, artworkToolData: ArtworkToolData] = { headerRope: Rope.ROPE; headerStream: IO.STREAM; headerStream _ IO.ROS[]; IF artworkToolData.artwork.source = NIL THEN { -- pure color artwork r,g,b: REAL; [r,g,b] _ SVShading.ExtractRGB[artworkToolData.artwork.color]; headerStream.PutF["Artwork: (pure color) [%g, %g, %g]", [real[r]], [real[g]], [real[b]]]; } ELSE { r,g,b: REAL; [r,g,b] _ SVShading.ExtractRGB[artworkToolData.artwork.color]; headerStream.PutF["Artwork: %g %g backColor: [%g, %g, %g]", [rope[sceneName]], [rope[assemblyName]], [real[r]], [real[g]], [real[b]]]; }; headerRope _ IO.RopeFromROS[headerStream]; artworkToolData.outer.name _ headerRope; ViewerOps.PaintViewer[artworkToolData.outer, caption, FALSE, NIL]; }; Painter: PUBLIC PROC [proc: PROC [dc: Imager.Context], artworkToolData: ArtworkToolData] = TRUSTED { artworkToolData.proc _ proc; ViewerOps.PaintViewer[viewer: artworkToolData.picture, hint: client, whatChanged: artworkToolData, clearClient: FALSE]; }; -- end of Painter SetArtwork: PUBLIC PROC [artworkTool: Viewer, artwork: Artwork, sceneName: Rope.ROPE, assemblyName: Rope.ROPE] = { artworkToolData: ArtworkToolData _ NARROW[artworkTool.data]; artworkToolData.artwork _ artwork; UpdateHeader[assemblyName, sceneName, artworkToolData]; DrawArtwork[NIL, artworkToolData, red, FALSE, FALSE]; }; RotateArtwork: PUBLIC PROC [artworkTool: Viewer, degrees: REAL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[artworkTool.data]; artwork: Artwork _ artworkToolData.artwork; SVCoordSys2d.RotateCCWAwrtB[artwork.artWRTPad, artwork.artWRTPad, degrees]; DrawArtwork[NIL, artworkToolData, red, FALSE, FALSE]; }; NormalizeArtwork: PUBLIC PROC [artworkTool: Viewer] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[artworkTool.data]; artwork: Artwork _ artworkToolData.artwork; SVCoordSys2d.PlaceAwrtB[artwork.artWRTPad, NIL, SVMatrix2d.Identity[]]; }; ScalarSetPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; scalar: REAL _ SVViewerTools.GetReal[artworkToolData.textSection.scalar, 1]; artworkToolData.scalar _ scalar; DrawArtwork[NIL, artworkToolData, red, FALSE, FALSE]; }; ScalarPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; ViewerTools.SetSelection[artworkToolData.textSection.scalar]; }; Tentfilter: PROC [x,y: REAL] RETURNS [val: REAL] = TRUSTED { RETURN [1.0-ABS[x]]; }; DrawArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; artwork: Artwork _ artworkToolData.artwork; scalar: REAL _ artworkToolData.scalar; DoDrawArtwork: PROC [dc: Imager.Context] = TRUSTED { SVArtwork.DrawArtwork[dc, artwork, artworkToolData.origin, scalar]; }; Painter[DoDrawArtwork, artworkToolData]; CrossHairs[parent, clientData, mouseButton, shift, control]; }; PlaceOrigin: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { picture: Viewer _ NARROW[parent]; originX, originY: INTEGER; artworkToolData: ArtworkToolData _ NARROW[clientData]; originX _ picture.cw;-- convert window width to real originY _ picture.ch;-- convert window height to real originX _ originX/2;-- find the midpoint in window coords originY _ originY/2; artworkToolData.origin _ [originX, originY]; }; CrossHairs: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { DoCrossHairs: PROC [dc: Imager.Context] = TRUSTED { SVDraw.CrossHairs[dc, artworkToolData.origin]; }; artworkToolData: ArtworkToolData _ NARROW[clientData]; Painter[DoCrossHairs, artworkToolData]; }; Position: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; artwork: Artwork _ artworkToolData.artwork; assembly: Slice; editToolData: EditToolData _ artworkToolData.editToolData; skitterWORLD, moWORLD, skitterMO: Matrix4by4; imagePoint: Point2d; origin: Point3d; normal: Vector3d; [assembly, ----, ----] _ SVSelections.GetSkitterData[editToolData]; skitterWORLD _ SVCaret.GetPosition[editToolData.skitter]; WITH assembly.shape SELECT FROM shape: Shape => moWORLD _ SVCoordSys.WRTWorld[shape.coordSys]; alist: SliceList => { Feedback.AppendRaw[$Solidviews, "Can't position with skitter on a Composite assembly", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; ENDCASE => ERROR; skitterMO _ SVMatrix3d.AInTermsOfB[skitterWORLD, moWORLD]; origin _ SVMatrix3d.OriginOfMatrix[skitterMO]; normal _ SVMatrix3d.ZAxisOfMatrix[skitterMO]; imagePoint _ GetImagePointFromSurfacePoint[artwork, origin, normal]; SVCoordSys2d.PlaceTranslationAwrtB[artwork.artWRTPad, NIL, imagePoint]; DrawArtwork[NIL, artworkToolData, red, FALSE, FALSE]; }; GetImagePointFromSurfacePoint: PUBLIC PROC [artwork: Artwork, surfacePt: Point3d, normal: Vector3d] RETURNS [imagePoint: Point2d] = { onSurf: BOOL; WITH artwork.surface SELECT FROM tube: Tube => { tubePoint: Point2d; tubePoint _ SVMappings.Point3dToTubePoint[surfacePt]; [imagePoint, onSurf] _ SVMappings.TubeToImage[tubePoint, tube]; IF NOT onSurf THEN { Feedback.AppendRaw[$Solidviews, "Point not on tube mapping surface.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; }; box: Box => { boxPoint: Point2d; SELECT artwork.oMap FROM radial => [boxPoint, onSurf] _ SVMappings.BoxRadialOInverse[surfacePt, normal, box]; orthogonal => [boxPoint, onSurf] _ SVMappings.BoxOrthogonalOInverse[surfacePt, normal, box]; ENDCASE => ERROR; IF NOT onSurf THEN { Feedback.AppendRaw[$Solidviews, "Point not on box mapping surface.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; [imagePoint, onSurf] _ SVMappings.BoxToImage[boxPoint, box]; IF NOT onSurf THEN { Feedback.AppendRaw[$Solidviews, "Point not on box mapping surface.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; }; ENDCASE => ERROR Feedback.Problem["Other artworks are not yet implemented"]; }; SetColor: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; success: BOOL; [artworkToolData.paintColor, success] _ SVViewerTools.GetColor[artworkToolData.textSection.color]; IF NOT success THEN { Feedback.AppendRaw[$Solidviews, "Color not understood. Using red.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; artworkToolData.paintColor _ ImagerColor.ColorFromRGB[[0.9,0.5,0.5]]; RETURN; }; }; OpenFileButton: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; OpenFile[artworkToolData]; }; OpenFile: PUBLIC PROC [artworkToolData: ArtworkToolData] = TRUSTED { artwork: Artwork _ artworkToolData.artwork; editToolData: EditToolData _ artworkToolData.editToolData; fileName: Rope.ROPE _ ViewerTools.GetSelectionContents[]; fullName, wdir: Rope.ROPE; success: BOOL; numberOfSamplesX, numberOfSamplesY: NAT; raster: AIS.Raster; redRope: Rope.ROPE; greenRope: Rope.ROPE; blueRope: Rope.ROPE; bwRope: Rope.ROPE; realRed, realGreen, realBlue, realBlack: REAL; redValue, greenValue, blueValue, blackValue: NAT; wdir _ editToolData.originalWorkingDirectory; success _ TRUE; [fullName,,] _ FS.ExpandName[fileName, wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; Feedback.AppendRaw[$Solidviews, error.explanation, oneLiner]; Feedback.BlinkRaw[$Solidviews]; CONTINUE; } ]; IF NOT success THEN RETURN; artwork.source _ fullName; artwork.open _ TRUE; numberOfSamplesX _ numberOfSamplesY _ 300; raster _ NEW[AIS.RasterPart _ [numberOfSamplesY, numberOfSamplesX, rd, 8, -1, 65535]]; redRope _ Rope.Concat[SVFiles.FilenameMinusExtension[fullName], "-red.ais"]; greenRope _ Rope.Concat[SVFiles.FilenameMinusExtension[fullName], "-grn.ais"]; blueRope _ Rope.Concat[SVFiles.FilenameMinusExtension[fullName], "-blu.ais"]; bwRope _ fullName; artwork.isColorFile _ TRUE; artwork.redfile _ AIS.CreateFile[redRope, raster]; artwork.redWindow _ AIS.OpenWindow[artwork.redfile]; artwork.greenfile _ AIS.CreateFile[greenRope, raster]; artwork.greenWindow _ AIS.OpenWindow[artwork.greenfile]; artwork.bluefile _ AIS.CreateFile[blueRope, raster]; artwork.blueWindow _ AIS.OpenWindow[artwork.bluefile]; artwork.blackfile _ AIS.CreateFile[bwRope, raster]; artwork.blackWindow _ AIS.OpenWindow[artwork.blackfile]; FOR i: NAT IN [0..numberOfSamplesX) DO FOR j: NAT IN [0..numberOfSamplesY) DO [realRed, realGreen, realBlue] _ SVShading.ExtractRGB[artwork.color]; realBlack _ ImagerColorPrivate.IntensityFromColor[NARROW[artwork.color]]; redValue _ Real.Fix[realRed*255.0]; greenValue _ Real.Fix[realGreen*255.0]; blueValue _ Real.Fix[realBlue*255.0]; blackValue _ Real.Fix[realBlack*255.0]; AIS.WriteSample[artwork.redWindow, redValue, i, j]; AIS.WriteSample[artwork.greenWindow, greenValue, i, j]; AIS.WriteSample[artwork.blueWindow, blueValue, i, j]; AIS.WriteSample[artwork.blackWindow, blackValue, i, j]; ENDLOOP; ENDLOOP; Feedback.PutFRaw[$Solidviews, oneLiner, " New color %g's created.", [rope[bwRope]]]; }; CloseFileButton: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; CloseFile[artworkToolData]; }; CloseFile: PUBLIC PROC [artworkToolData: ArtworkToolData] = TRUSTED { SVArtwork.CloseArtwork[artworkToolData.artwork]; }; PressButton: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { artworkToolData: ArtworkToolData _ NARROW[clientData]; editToolData: EditToolData _ artworkToolData.editToolData; artwork: Artwork _ artworkToolData.artwork; scalar: REAL _ artworkToolData.scalar; fullName: Rope.ROPE; startTime: BasicTime.GMT; endTime: BasicTime.GMT; totalTime: INT; pixelsPerMeter: REAL _ 0.0254 / 72.0; timeRope: Rope.ROPE; pressName, wdir: Rope.ROPE; success: BOOL; ipRef: ImagerInterpress.Ref; DoMakeInterpress: SAFE PROC [dc: Imager.Context] = TRUSTED { Imager.ScaleT[dc, pixelsPerMeter]; SVArtwork.DrawArtwork[dc, artwork, artworkToolData.origin, scalar]; }; pressName _ ViewerTools.GetSelectionContents[]; IF Rope.Length[pressName] = 0 THEN RETURN; wdir _ editToolData.originalWorkingDirectory; success _ TRUE; [fullName,,] _ FS.ExpandName[pressName, wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; CONTINUE; } ]; IF NOT success THEN RETURN; ipRef _ ImagerInterpress.Create[fullName]; Feedback.AppendRaw[$Solidviews, Rope.Cat["Pressing ", fullName, "... "], begin]; startTime _ BasicTime.Now[]; ImagerInterpress.DoPage[ipRef, DoMakeInterpress, 1.0]; ImagerInterpress.Close[ipRef]; endTime _ BasicTime.Now[]; totalTime _ BasicTime.Period[startTime, endTime]; timeRope _ IO.PutFR[" Done. Took (%r)", [integer[totalTime]]]; Feedback.AppendRaw[$Solidviews, timeRope, end]; }; END. ͺFile: SVArtworkUserImpl.mesa Created December 18, 1982 1:42 am Copyright c 1984 by Xerox Corporation. All rights reserved. Contents: Viewer for Two dimensional artwork for mappings Last edited by Bier on August 7, 1987 3:59:49 pm PDT SVEditTool / ArtworkTool communication Button procs parent is the picture find the center of the picture in picture coordinates Get the current skitter position. Make sure that the skitter assembly is the same as the current artwork assembly. Inverse map the skitter surface point. Use this as the center of the AIS file. surfacePt should be in assembly coordinates. TIMING VARABLES PRESS VARIABLES START TIMING START PRESSING END TIMING Κ T˜Ihead1šœ™Jšœ!™!Jšœ Οmœ1™˜>JšœY˜YJšœ˜—šžœ˜Jšœžœ˜ Jšœ>˜>Jšœ†˜†Jšœ˜—Jšœ žœ˜*Jšœ(˜(Jšœ6žœžœ˜BJšœ˜—J˜š  œžœžœžœ<žœ˜eJšœ˜Jšœ6˜6Jšœ ˜ Jšœ˜Jšœ žœ˜JšœŸ˜—J˜Jšœ&™&J˜š   œžœžœ9žœžœ˜rJšœ#žœ˜šœ˜Jšœa˜aJ˜Jšžœ˜J˜—Jšžœžœ˜Jšœ‘œ!‘œ‘œ˜:Jšœ*‘œ˜.Jšœ)‘œ˜-J˜JšœD˜DJšœ6žœ˜GJšœ žœžœžœ˜5Jšœ˜J˜—š œžœžœ:žœ˜…Jšœ,™,Jšœžœ˜ J˜Jšžœžœž˜ ˜Jšœ˜Jšœ5˜5JšœΟb œ4˜?šžœžœžœ˜JšœP˜PJ˜Jšžœ˜J˜—J˜—šœ ˜ Jšœ˜Jšžœž˜JšœT˜TJšœ\˜\Jšžœžœ˜šžœžœžœ˜JšœO˜OJ˜Jšžœ˜J˜—Jšœ’ œ1˜<šžœžœžœ˜JšœO˜OJ˜Jšžœ˜J˜—J˜—Jšžœžœ<˜LJšœ˜J˜—š œžœžœ žœžœžœžœ,žœ ˜xJšœ#žœ ˜6Jšœ˜J˜Jšœb˜bšžœžœ žœ˜JšœO˜OJšœ˜JšœE˜EJšžœ˜J˜—J˜J˜—š œžœžœ žœžœžœžœ,žœžœ˜~Jšœ#žœ ˜6Jšœ˜J˜J˜—š œžœžœ&žœ˜DJšœ+˜+Jšœ:˜:Jšœžœ&˜9Jšœžœ˜Jšœ žœ˜Jšœ$žœ˜(Iprocšœžœ˜Lšœžœ˜Lšœžœ˜Lšœžœ˜Lšœ žœ˜Lšœ)žœ˜.Lšœ-žœ˜1J˜Jšœ-˜-Jšœ žœ˜šœžœ˜+šœžœ žœžœ˜*Jšœ žœ˜Jšœ=˜=Jšœ˜Jšžœ˜ J˜—Jšœ˜—Jšžœžœ žœžœ˜Jšœ˜Jšœžœ˜Jšœ*˜*J˜Lšœ žœžœF˜VL˜JšœL˜LJšœN˜NJšœM˜MLšœ˜L˜Lšœžœ˜Lšœ˜Lšœžœ˜2Lšœžœ˜4Lšœžœ˜6Lšœžœ˜8Lšœžœ˜4Lšœžœ˜6Lšœžœ˜3Lšœžœ˜8šžœžœžœž˜&šžœžœžœž˜&LšœE˜EJšœ2žœ˜ILšœ#˜#Lšœ'˜'Lšœ%˜%Lšœ'˜'Lšžœ0˜3Lšžœ4˜7Lšžœ2˜5Lšžœ4˜7—Lšžœ˜—Lšžœ˜LšœT˜TL˜J˜—š œžœžœ žœžœžœžœ,žœžœ˜Jšœ#žœ ˜6Jšœ˜J˜J˜—š  œžœžœ&žœ˜EJšœ0˜0J˜J˜—š  œžœžœ žœžœžœžœ,žœžœ˜{Jšœ#žœ ˜6Jšœ:˜:Jšœ+˜+Jšœžœ˜&Jšœžœ˜Jšœ™Jšœžœ˜Jšœžœ˜Jšœ žœ˜L˜%Jšœžœ˜Jšœ™Jšœžœ˜Jšœ˜Lšœ˜š œž œ!˜